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