IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Script "list les groupes locaux et ses membres", comment afficher tous les groupes ?


Sujet :

Scripts/Batch

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut Script "list les groupes locaux et ses membres", comment afficher tous les groupes ?
    Bonjour,

    Je cherche à lister les groupes locaux et ses membres sur une machine distante en PowerShell.

    Après quelques tests et recherche, j'ai trouvé cette source qui répond (presque) à mes attentes :

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Function Get-LocalGroupMembers
    {
    param(
    [Parameter(ValuefromPipeline=$true)][array]$server = $env:computername,
    $GroupName = $null
    )
    PROCESS {
        $finalresult = @()
        $computer = [ADSI]"WinNT://$server"
     
        if (!($groupName))
        {
        $Groups = $computer.psbase.Children | Where {$_.psbase.schemaClassName -eq "group"} | select -expand name
        }
        else
        {
        $groups = $groupName
        }
        $CurrentDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().GetDirectoryEntry() | select name,objectsid
        $domain = $currentdomain.name
        $SID=$CurrentDomain.objectsid
        $DomainSID = (New-Object System.Security.Principal.SecurityIdentifier($sid[0], 0)).value
     
     
        foreach ($group in $groups)
        {
        $gmembers = $null
        $LocalGroup = [ADSI]("WinNT://$server/$group,group")
     
     
        $GMembers = $LocalGroup.psbase.invoke("Members")
        $GMemberProps = @{Server="$server";"Local Group"=$group;Name="";Type="";ADSPath="";Domain="";SID=""}
        $MemberResult = @()
     
     
            if ($gmembers)
            {
            foreach ($gmember in $gmembers)
                {
                $membertable = new-object psobject -Property $GMemberProps
                $name = $gmember.GetType().InvokeMember("Name",'GetProperty', $null, $gmember, $null)
                $sid = $gmember.GetType().InvokeMember("objectsid",'GetProperty', $null, $gmember, $null)
                $UserSid = New-Object System.Security.Principal.SecurityIdentifier($sid, 0)
                $class = $gmember.GetType().InvokeMember("Class",'GetProperty', $null, $gmember, $null)
                $ads = $gmember.GetType().InvokeMember("adspath",'GetProperty', $null, $gmember, $null)
                $MemberTable.name= "$name"
                $MemberTable.type= "$class"
                $MemberTable.adspath="$ads"
                $membertable.sid=$usersid.value
     
     
                if ($userSID -like "$domainsid*")
                    {
                    $MemberTable.domain = "$domain"
                    }
     
                $MemberResult += $MemberTable
                }
     
             }
             $finalresult += $MemberResult 
        }
        $finalresult | select server,"local group",name,type,domain,sid
        }
    }

    Avec ce résultat :


    Get-LocalGroupMembers -server "scsm-server" | ft -AutoSize

    Server Local Group Name Type Domain SID
    ------ ----------- ---- ---- ------ ---
    scsm-server Administrators Administrator User S-1-5-21-1473970658-40817565-21663372-500
    scsm-server Administrators Domain Admins Group contoso S-1-5-21-4081441239-4240563405-729182456-512
    scsm-server Guests Guest User S-1-5-21-1473970658-40817565-21663372-501
    scsm-server Remote Desktop Users pladmin User contoso S-1-5-21-4081441239-4240563405-729182456-1272
    scsm-server Users INTERACTIVE Group S-1-5-4
    scsm-server Users Authenticated Users Group S-1-5-11
    Cependant, cette fonction m'affiche que les groupes qui ont des membres. J'aurai aimé tous les lister.

    J'ai pensé faire un "else" après le "if ($gmembers)" et remplir le tableau avec les données nécessaires, cependant, cela ne fonctionne pas. D'ailleurs j'ai remarqué que la condition est toujours vrai. La variable "$group" m'affiche bien tout les groupes.

    En gros, je n'arrive pas à construire le tableau avec les groupes sans membres...

    Je recherche depuis hier matin, mais sans succès.

    Auriez-vous une idée ?
    Merci d'avance.

    a+
    Arnaud

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    de prime abord je dirais que le traitement de chaque collection de membres est à revoir :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $gmembers=@()
      foreach ($gmember in $gmembers) {'ok'}
    #ras
     $gmembers=@($null)
      foreach ($gmember in $gmembers) {'ok'}
    #ok
    Mais je n'ai pas testé.

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 281
    Points : 520
    Points
    520
    Par défaut
    Bonjour arnaudperfect et Laurent

    @Laurent : j'ai testé ta solution mais $LocalGroup.psbase.invoke("Members") renvoie toujours un objet System.MarshalByRefObject même quand les groupes sont vide et j'ai pas trouvé comment savoir si l'objet est vide !!!

    @Arnaud : j'ai modifié le script pour une solution propre à mes yeux !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Function Get-LocalGroupMembers {
        param(
        [Parameter(ValuefromPipeline=$true)][array]$server = $env:computername,
        $GroupName = $null
        )
    
        PROCESS {
            $finalresult = @()
            $computer = [ADSI]"WinNT://$server"
     
            if (!($groupName)) {
                $Groups = $computer.psbase.Children | Where {$_.psbase.schemaClassName -eq "group"} | select -expand name
                }
            else {
                $groups = $groupName
                }
            $CurrentDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().GetDirectoryEntry() | select name,objectsid
            $domain = $currentdomain.name
            $SID = $CurrentDomain.objectsid
            $DomainSID = (New-Object System.Security.Principal.SecurityIdentifier($sid[0], 0)).value
     
     
            foreach ($group in $groups) {
                $gmembers = $null
                $LocalGroup = [ADSI]("WinNT://$server/$group,group")
     
                $GMembers = $LocalGroup.psbase.invoke("Members")
                $GMemberProps = @{Server="$server";"Local Group"=$group;Name="";Type="";ADSPath="";Domain="";SID=""}
                $MemberResult = @()
     
                foreach ($gmember in $gmembers) {
                    $membertable = new-object psobject -Property $GMemberProps
                    $name = $gmember.GetType().InvokeMember("Name",'GetProperty', $null, $gmember, $null)
                    $sid = $gmember.GetType().InvokeMember("objectsid",'GetProperty', $null, $gmember, $null)
                    $UserSid = New-Object System.Security.Principal.SecurityIdentifier($sid, 0)
                    $class = $gmember.GetType().InvokeMember("Class",'GetProperty', $null, $gmember, $null)
                    $ads = $gmember.GetType().InvokeMember("adspath",'GetProperty', $null, $gmember, $null)
                    $MemberTable.name = "$name"
                    $MemberTable.type = "$class"
                    $MemberTable.adspath = "$ads"
                    $membertable.sid = $usersid.value
     
                    if ($userSID -like "$domainsid*") {
                        $MemberTable.domain = "$domain"
                        }
     
                    $MemberResult += $MemberTable
                    }
    
                if (-not $MemberResult.Count) {
                    $membertable = new-object psobject -Property $GMemberProps
                    $MemberResult += $MemberTable
                    }
                $finalresult += $MemberResult 
                }
            $finalresult | select server,"local group",name,type,domain,sid
            }
        }

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut, 6ratgus,
    Citation Envoyé par 6ratgus Voir le message
    j'ai testé ta solution mais $LocalGroup.psbase.invoke("Members") renvoie toujours un objet System.MarshalByRefObject même quand les groupes sont vide et j'ai pas trouvé comment savoir si l'objet est vide !!!
    Rapido, si j'ai bien compris l'appel à Members renvoie une interface COM qui implémente IEnumVariant, l'instruction Foreach la traite en interne (dotnet) directement.
    Soit on itère sur cette collection AVANT le foreach, donc 2 itérations (l'interface ne propose pas de propriété count), soit on construit un tableau de tableau (ou une hashtable) AVANT le traitement et on détermine à la fin ceux qui sont vides
    Ou encore découper le code existant en 2 fonctions get-group et get-member, là on gère plus facilement le résultat.
    Mais je n'ai tjr pas testé

Discussions similaires

  1. comment afficher tous les titres qui ont cette sous chainne comme
    Par 21247692 dans le forum Développement
    Réponses: 5
    Dernier message: 26/02/2009, 22h48
  2. Réponses: 1
    Dernier message: 18/02/2009, 16h04
  3. Comment Afficher tous les noms ?
    Par souheil59 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/11/2008, 18h28
  4. [MySQL] Comment afficher tous les champs d'une table?
    Par Nibor dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/11/2006, 20h20
  5. [XSLT] comment afficher tous les noms de balises
    Par stanilas dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 12/11/2005, 22h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo