Salut à tous !
Ca fait déjà quelques années que je surf ici et j'ai jamais posté de sources, commentaires... Simplement, parceque ce que je voulait poster existait déjà, et bien souvent en mieux ! Mais voila, pendant 3 mois j'ai galéré à récupérer TOUT les droits (écriture, modification, lecture...) d'une ressource. J'ai trouvé grâce à ce lien:
http://www.codeproject.com/dotnet/ntsecuritynet.asp#xx437173xx
Dedans est expliqué rapidement que VB.net la sécurité, c'est pas top et que des internautes on créés une DLL permettant de faciliter le boulot des admins :D
Voici en zip la dll !
Mon code (ci-dessous) permet de récupérer la liste des personnes ayant les droits en écriture et lecture sur un dossier X.
On donne le path de la ressource à la fonction (ByVal path As String) et elle récupère les users un par un (les infos des users sont contenu dans un "ACE" (AccessEntry) qui fait partit d'une DACL (DiscretionaryAccessControlList). Une DACL contient plusieurs ACE).
Voila, j'espère vous faire gagner un temps précieux :)
Source / Exemple :
'En haut du code:
'Imports System.IO,System.Windows
'Imports Microsoft.Win32.Security 'Projet/Ajouter une référence/"Parcourir"/ Ajouter "mmsseclib.dll"
Function ScanRessource(ByVal path As String)
'Vérification:
Dim oFS As New DirectoryInfo(path) 'Dossier à scanné (= dossier parent)
Dim oDir As DirectoryInfo 'Sous dossier de oFS
Dim Lecture, Modif, myPath, myUserName As String 'variables temp...
For Each oDir In oFS.GetDirectories()
'Récupération des droits d'accès:
myPath = Replace(oDir.FullName, "\", "\\")
Dim sec As New SecuredObject(myPath, SecuredObjectType.FileObject)
Dim ace As AccessEntry
Lecture = ""
Modif = ""
'Je récupère un OBJET "sec" sur le dossier X.
'Cette objet (le DACL) contient un tableau d'ACE (qui sont eux-même des tableaux).
'Pour chaque ACE du tableau DACL,
'je récupère le nom contenu dans le ACE -> ace.fullname
'Puis les droits -> ace.rights
For Each ace In sec.Permissions
'Je veux pas récupérer les droits Administrateurs:
If ace.Trustee.FullName.ToString <> "WORKGROUP\Admins du domaine" And ace.Trustee.FullName.ToString <> "" Then
'Par défaut, je bouge le nom de domaine.
'Ex: WORKGROUP\Niko
myUserName = ace.Trustee.FullName.Replace("WORKGROUP\", "")
'Droits lecture ou écriture ?
Select Case ace.Rights
Case AccessRights.FileExecute, AccessRights.FileRead, AccessRights.FileReadExecute
If Lecture.IndexOf(myUserName) = -1 Then '(pas de doublons de nom dans ma variable)
Lecture &= myUserName & ";" '-> X;X;X;X...
End If
'Ecriture
Case AccessRights.FileModify
If Lecture.IndexOf(myUserName) = -1 And Modif.IndexOf(myUserName) = -1 Then
Modif &= myUserName & ";" '-> X;X;X;X...
End If
End Select
End If 'FIN DE: "If ace.Trustee.FullName.ToString <> "WORKGROUP\A..."
Next ace 'Users suivant...
Next oDir
End Function
Conclusion :
Bon, si chuis pas claire, merci de le faire savoir... La sécurité microsoft reste tout de même assez difficile à assimiler. Une fois cela fait, c'est un jeu d'enfant :)
Partagez vos connaissances !
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.