Les permissions d’un share

Dans cet article, nous avions exploré les fonctions de Netapi32.dll pour récupérer des informations relatives aux shares SMB.

Nous allons maintenant voir comment récupérer les permissions de ces shares.

Il existe des fonctions qui gèrent les SIDs, ACLs, et ACEs dans advapi32.dll, et nous allons capitaliser sur l’article concernant le Netapi pour en faire un tout, et lire les permissions sans passer par WMI.

Tout d’abord voici une nouvelle version du script netapi.ps1:

Il faudra avec cette version dot-sourcer le script pour que les cmdlets soient définies:

 

Une fois les cmdlets définies nous allons avoir besoin de celle qui récupère le level 502 des shares:

et avec cet array, nous allons pour chaque élément vérifier si le SecurityDescriptor est présent. Pour ensuite récupérer l’ACL dans un buffer en mémoire.

A partir de l’ACL nous pouvons récupérer l’ACE qui contient le SID et la permission.

Avec un peu de gymnastique de pointeurs et buffers de structures, nous allons pouvoir traduire tout cela en objets Powershell qui peuvent être utilisés.

Voici le script complet:

L’output est simple mais peut être adapté:

Sans les mains WMI.

Voici l’article de référence en C# qui traite de ce sujet http://blogs.msdn.com/b/dsadsi/archive/2012/03/30/to-read-shared-permissions-of-a-server-resource-in-c-using-netsharegetinfo.aspx

Voici un mise à jour du script d’exemple, cette nouvelle version traite le problème de l’exception « Some or all identity references could not be translated. ».

Pour régler ce problème nous allons récupérer la liste des utilisateurs locaux d’une machine donnée et comparer les SIDs sans passer par Translate.

 

Voici le script en entier (renseigner $server en début du script):

 

  • Arnaudperfect

    Bonjour,

    Merci pour ce billet !

    Je viens de testé votre script en local avec succès mais sur un serveur distant, j’ai cette erreur :

    Exception calling « Translate » with « 1 » argument(s): « Some or all identity references could not be translated. »
    At D:\PowerShell\Script\test.PS1:65 char:7
    + $objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : IdentityNotMappedException

    Je ne comprend pas pourquoi j’ai cette erreur, car j’utilise cette fonction sous un autre script et cela fonctionne. Je me demande s’il n’arrive pas à faire la traduction…

    J’avais été obliger de faire ceci (utilisation de WMI malheureusement) :

    #Try to translate the SID to an account
    Try{
    $objSID = New-Object System.Security.Principal.SecurityIdentifier($id)
    $name = ( $objSID.Translate([System.Security.Principal.NTAccount]) ).Value
    }Catch{
    Try{
    $WmiSid = Get-WmiObject -Class Win32_Group -ComputerName $ComputerName -Filter « DOMAIN=’$ComputerName’ AND SID=’$id' » -ErrorAction SilentlyContinue | Select Caption, SID
    If(!([string]::IsNullOrEmpty($WmiSid.Caption))){
    $name = $WmiSid.Caption
    }else{
    $name = « Le SID de l’utilisateur n’a pas été identifié sur le serveur distant »
    }
    }Catch{
    $name = « WMI erreur : Le SID de l’utilisateur n’a pas été identifié »
    }
    }