Page 1 sur 2

Protection Fichier&Dossier

Publié : mar. 26/sept./2006 12:54
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!!!

Publié : mar. 26/sept./2006 14:45
par Droopy
Sous Windows XP, pour la gestion des droits NTFS, CACLS te permettra de définir ces droits.

Mauvaise nouvelle

Publié : jeu. 28/sept./2006 17:05
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.

Publié : jeu. 28/sept./2006 18:47
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:

Ok je vais voir ce que ça donne

Publié : jeu. 28/sept./2006 23:17
par SpaceMan
ok je vais voir ce que ça donnera pour pour l'adapter à PB
thank :)

voici ce que j'ai fait

Publié : ven. 29/sept./2006 19:10
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

Publié : ven. 29/sept./2006 19:50
par Dr. Dri
je crois que tu ne peux pas lire si tu as le flag Wait

Dri

Publié : ven. 29/sept./2006 22:11
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 

Publié : ven. 29/sept./2006 23:05
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

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


Publié : sam. 30/sept./2006 1:59
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

Publié : sam. 30/sept./2006 20:52
par Droopy
bon boulot flype :wink:

C'est du bon les gars!

Publié : lun. 02/oct./2006 19:54
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!!

Publié : mar. 03/oct./2006 9:26
par Flype
et ca fonctionne ?

A merveille

Publié : mar. 03/oct./2006 15:35
par SpaceMan
le code fonctionne à merveille.
Serait il possible de l'adapter aux dossiers ?

Publié : mar. 03/oct./2006 16:42
par Droopy
Tu spécifie les droits du dossiers dans Cacls