Protection Fichier&Dossier

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
SpaceMan
Messages : 290
Inscription : mar. 26/oct./2004 19:35
Contact :

Protection Fichier&Dossier

Message par SpaceMan »

Salut chers basiciens

je voudrais savoir comment programmer les droits d'accès à un fichier de sorte que lorsqu'on essaie d'ouvrir ce dernier qu'on ait le message "accès refusé"

Merci A vous!!!
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Sous Windows XP, pour la gestion des droits NTFS, CACLS te permettra de définir ces droits.
SpaceMan
Messages : 290
Inscription : mar. 26/oct./2004 19:35
Contact :

Mauvaise nouvelle

Message par SpaceMan »

salut droopy
j'ai parcouru ta Lib mais je n'ai pas été satisfait d'ailleurs elle est excellente ta LIB DROOPY.
en fait tu parlais de
Sous Windows XP, pour la gestion des droits NTFS, CACLS te permettra de définir ces droits.
C'est quoi CACLS ?
je tiens vraiment à ce programme et je compte sur les basiciens pour y arriver.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

CACLS est un utilitaire fourni avec XP.
Lance un invite de commande ( CMD )
Puis tape CACLS /? pour avoir la syntaxe

Tu pourrais ensuite avec PureBasic ( commande RunProgram ) exécuter CACLS en mode caché afin d'ajuster les droits :wink:
SpaceMan
Messages : 290
Inscription : mar. 26/oct./2004 19:35
Contact :

Ok je vais voir ce que ça donne

Message par SpaceMan »

ok je vais voir ce que ça donnera pour pour l'adapter à PB
thank :)
SpaceMan
Messages : 290
Inscription : mar. 26/oct./2004 19:35
Contact :

voici ce que j'ai fait

Message par SpaceMan »

salut
salut c'est un programme qui donne des droits d'accès à un fichier
le programme donne ces droits en utilisant la console en mode caché.
en fait comme me l'avait suggerer Droopy j'utilise l'utilitaire cacls de MS-DOS
pour y arriver mais ça bloque.
Après compilation j'ai un msg du genre:
la memoire ne peut pas etre read

Code : Tout sélectionner


CreatePreferences("c:\test.doc")
SetEnvironmentVariable("Fichiers", Fichiers$);est il possible que la variable d'environnement 
;et la variable Fichier$ aient le meme nom ?

Filtre$ = "Texte (*.log)|*.txt;*.bat|PureBasic (*.pb)|*.pb|Tous les fichiers (*.*)|*.*"
  Filtre  = 0
   Fichier$ = OpenFileRequester("Sélectionner un Fichier", FichierParDefaut$, Filtre$, Filtre)     
    If Fichier$
;*MemoireID = AllocateMemory(5000)  
Resultat = RunProgram("C:\WINDOWS\system32\cmd.exe","","",#PB_Program_Wait|#PB_Program_Open|#PB_Program_Write|#PB_Program_Hide)
;PokeS(*MemoireID, "cacls info.txt /p Admin:N"+Input())
WriteProgramString(cmd,"cacls Fichiers$ /p Admin:N")
CloseProgram(cmd)
EndIf

;je commence par decourager  
; IDE Options = PureBasic v4.00 (Windows - x86)
; CursorPosition = 7
; Folding = -
; EnableUnicode
; EnableThread
; EnableXP
; DisableDebugger
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

je crois que tu ne peux pas lire si tu as le flag Wait

Dri
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Essaye ça :

Code : Tout sélectionner

#Commande="CMD"
#Parametre="/C DIR C:\"

OpenWindow(0, 0, 0, 640, 480, #Commande+" "+#Parametre, #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
CreateGadgetList(WindowID(0)) 
EditorGadget(0, 10, 10, 620, 460) 
SetGadgetFont(0,LoadFont(0,"Courier",8))

console.l = RunProgram(#Commande,#Parametre,"",#PB_Program_Open|#PB_Program_Read|#PB_Program_Hide) 

While ProgramRunning(console)  
  Delay(1)
  While AvailableProgramOutput(console) 
    Ligne.s=ReadProgramString(console) 
    OEMTOCHAR_(Ligne,Ligne) ;/ Merci à LNA pour cette fonction
    AddGadgetItem(0, -1, Ligne) 
  Wend
Wend

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ou çà - j'ai pas l'habitude de manipuler les entree/sortie DOS mais çà a l'air de fonctionner - à vous de confirmer je suis pas spécialiste du tout :

Code : Tout sélectionner

;====================================================================================================================
; 
; Object:      Microsoft Cacls
; Information: Displays or modifies discretionary access control list (DACL) files.
; Information: Affiche ou modifie les listes DACL (Discretionary Access Control List) pour des fichiers spécifiés.
; WebSite:     http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/cacls.mspx
; 
;====================================================================================================================

#Access_None   = "n"
#Access_Read   = "r"
#Access_Write  = "w"
#Access_Change = "c"
#Access_Full   = "f"

;====================================================================================================================

Procedure.s ShowAccess(Fichier.s) ; Affiche les listes DACL des fichiers spécifiés.
  
  Protected handle.l, result.s
  
  handle = RunProgram("cacls", Fichier, "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Hide)
  
  If handle
    While ProgramRunning(handle)
      result + ReadProgramString(handle) + #CRLF$
    Wend
    CloseProgram(handle)
  EndIf
  
  ProcedureReturn result
  
EndProcedure
Procedure.l RevokeAccess(Fichier.s, Utilisateur.s) ; Révoque les droits d'accès de l'utilisateur spécifié.
  
  Protected handle.l, result.l
  
  handle = RunProgram("cacls", Fichier + " /e /r " + Utilisateur, "", #PB_Program_Hide|#PB_Program_Open|#PB_Program_Write|#PB_Program_Read)
  
  If handle
    result = WriteProgramStringN(handle, "O") ; Répond 'Oui' à la confirmation
    CloseProgram(handle)
  EndIf
  
  ProcedureReturn result
  
EndProcedure
Procedure.l DenyAccess(Fichier.s, Utilisateur.s) ; Refuse l'accès à l'utilisateur spécifié.
  
  Protected handle.l, result.l
  
  handle = RunProgram("cacls", Fichier + " /d " + Utilisateur, "", #PB_Program_Hide|#PB_Program_Open|#PB_Program_Write|#PB_Program_Read)
  
  If handle
    result = WriteProgramStringN(handle, "O") ; Répond 'Oui' à la confirmation
    CloseProgram(handle)
  EndIf
  
  ProcedureReturn result
  
EndProcedure
Procedure.l GrantAccess(Fichier.s, Utilisateur.s, Access.s) ; Accorde des droits d'accès à l'utilisateur spécifié. 
  
  Protected handle.l, result.l
  
  handle = RunProgram("cacls", Fichier + " /g " + Utilisateur + ":" + Access, "", #PB_Program_Hide|#PB_Program_Open|#PB_Program_Write|#PB_Program_Read)
  
  If handle
    result = WriteProgramStringN(handle, "O") ; Répond 'Oui' à la confirmation
    CloseProgram(handle)
  EndIf
  
  ProcedureReturn result
  
EndProcedure
Procedure.l ReplaceAccess(Fichier.s, Utilisateur.s, Access.s) ; Remplace les droits d'accès de l'utilisateur spécifié.
  
  Protected handle.l, result.l
  
  handle = RunProgram("cacls", Fichier + " /p " + Utilisateur + ":" + Access, "", #PB_Program_Hide|#PB_Program_Open|#PB_Program_Write|#PB_Program_Read)
  
  If handle
    result = WriteProgramStringN(handle, "O") ; Répond 'Oui' à la confirmation
    CloseProgram(handle)
  EndIf
  
  ProcedureReturn result
  
EndProcedure

;====================================================================================================================

FICHIER$ = "c:\test.txt"

If CreateFile(0, FICHIER$)
  
  CloseFile(0)
  
  ; Affiche les droits
  
  MessageRequester("ShowAccess", ShowAccess(FICHIER$))
  
  ; Accorde des droits d'accès
  
  If GrantAccess(FICHIER$, "BUILTIN\Utilisateurs", #Access_Full)
    MessageRequester("GrantAccess", "Effectué:" + #LF$ + ShowAccess(FICHIER$))
  EndIf
  
  ; Refuse l'accès
  
  If DenyAccess(FICHIER$, "PCASUS\Nico")
    MessageRequester("DenyAccess", "Effectué:" + #LF$ + ShowAccess(FICHIER$))
  EndIf
  
  ; Remplace les droits
  
  If ReplaceAccess(FICHIER$, "BUILTIN\Administrateurs", #Access_Read)
    MessageRequester("ReplaceAccess", "Effectué:" + #LF$ + ShowAccess(FICHIER$))
  EndIf
  
  ; Remplace les droits
  
  If ReplaceAccess(FICHIER$, "BUILTIN\Administrateurs", #Access_Full)
    MessageRequester("ReplaceAccess", "Effectué:" + #LF$ + ShowAccess(FICHIER$))
  EndIf
  
  ; Révoque les droits
  
  If RevokeAccess(FICHIER$, "BUILTIN\Administrateurs")
    MessageRequester("RevokeAccess", "Effectué:" + #LF$ + ShowAccess(FICHIER$))
  EndIf
  
  DeleteFile(FICHIER$)
  
EndIf

;====================================================================================================================

Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

sinon une autre solution - en utilisant l'api win32
sur lequel est basé CACLS je suppose.

c'est un peu hardcore alors je vous laisse chercher - voilà le début de bout de truc que j'ai commencé à chercher :

Code : Tout sélectionner

#SE_FILE_OBJECT = 1
#DACL_SECURITY_INFORMATION  = 4

#SET_ACCESS = 2

#SYNCHRONIZE           = $100000
#READ_CONTROL          = $20000
#WRITE_DAC             = $40000
#WRITE_OWNER           = $80000
#STANDARD_RIGHTS_READ  = #READ_CONTROL
#STANDARD_RIGHTS_WRITE = #READ_CONTROL
#DELETE                = $10000
#DELETE_CHILD          = $40
#ALL_ACCESS            = $F0000 | #SYNCHRONIZE | $1FF

#GENERIC_ALL     = $10000000
#GENERIC_EXECUTE = $20000000
#GENERIC_READ    = $80000000
#GENERIC_WRITE   = $40000000

#OBJECT_INHERIT_ACE    = $1
#CONTAINER_INHERIT_ACE = $2

Structure TRUSTEE
  *pMultipleTrustee.TRUSTEE
  MultipleTrusteeOperation.l
  TrusteeForm.l
  TrusteeType.l
  ptstrName.l
EndStructure
Structure EXPLICIT_ACCESS
  grfAccessPermissions.l
  grfAccessMode.l
  grfInheritance.l
  *Trustee.TRUSTEE
EndStructure

ObjName.s = "c:\toto.mdb"
TrusteeName.s = "BUILTIN\Administrateurs"
iPerm.l = 20321127

Result.l = GetNamedSecurityInfo_(@ObjName, #SE_FILE_OBJECT, #DACL_SECURITY_INFORMATION, @psidOwner, @psidGroup, @pDacl, @PSacl, @pSecurityDescriptor) 

If Result = #ERROR_SUCCESS 
  Debug "OK"
  Debug psidOwner
  Debug psidGroup
  Debug pDacl
  Debug pSacl
  Debug pSecurityDescriptor
  ea.EXPLICIT_ACCESS
  Debug BuildExplicitAccessWithName_(ea, TrusteeName, iPerm, #SET_ACCESS, #CONTAINER_INHERIT_ACE | #OBJECT_INHERIT_ACE)
  
Else
  Debug "GetNamedSecurityInfo Error: " + Str(OK)
EndIf

If pSecurityDescriptor
  Debug LocalFree_(pSecurityDescriptor)
EndIf

Debug "fin"
voir info sur msdn :
http://msdn.microsoft.com/library/defau ... tyinfo.asp
Image
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

bon boulot flype :wink:
SpaceMan
Messages : 290
Inscription : mar. 26/oct./2004 19:35
Contact :

C'est du bon les gars!

Message par SpaceMan »

Dri
je crois que tu ne peux pas lire si tu as le flag Wait
j'ai lu le message plutard dans la zone d'info :(



Droopy
j'ai essayé le tiens aussi et c'était bon :)


Flype
j'ai pas l'habitude de manipuler les entree/sortie DOS mais çà a l'air de fonctionner - à vous de confirmer je suis pas spécialiste du tout
je t'assure que c'est du bon boulot le code est simple et très compréhensible. :D
je le préfére par rapport à celui de l'(API) :evil:

Encore bravo à tous!!
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

et ca fonctionne ?
Image
SpaceMan
Messages : 290
Inscription : mar. 26/oct./2004 19:35
Contact :

A merveille

Message par SpaceMan »

le code fonctionne à merveille.
Serait il possible de l'adapter aux dossiers ?
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Tu spécifie les droits du dossiers dans Cacls
Répondre