Récupérer tous les droits ntfs d'une ressource

Description

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 !

Codes Sources

A voir également

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.