windows - Brugere og Lokal Grupperapport ved hjælp af Powershell?

Indlæg af Hanne Mølgaard Plasc

Problem



Er der en enkel måde at bruge powerhell til at vise alle lokale Windows Grupper, der er aktive på en maskine og de brugere, der er en del af disse grupper? En anden del af dette spørgsmål ville være, hvis det kan udvides til at se på mere end en maskine ad gangen.

Bedste reference


Faktisk kan du med ADSI type genvej og WinNT moniker. Her er et eksempel for at liste grupper og medlemmer fra din egen maskine:


$server="."
$computer = [ADSI]"WinNT://$server,computer"

$computer.psbase.children | where { $\_.psbase.schemaClassName -eq 'group' } | foreach {
    write-host $\_.name
    write-host "------"
    $group =[ADSI]$\_.psbase.Path
    $group.psbase.Invoke("Members") | foreach {$\_.GetType().InvokeMember("Name", 'GetProperty', $null, $\_, $null)}
    write-host
}

Andre referencer 1


Powershell har ingen iboende støtte til en sådan funktion. Men det er nemt at pakke kommandoen 'net localgroup' med et par powerhell-funktioner og dermed aktivere det i rørledningen.


Få lokale grupper


function Get-LocalGroups() {
  net localgroup | ?{ $\_ -match "^*.*" } | \%{ $\_.SubString(1) };
}


Få medlemmer af lokal gruppe


function Get-LocalGroupMembers() {
  param ([string]$groupName = $(throw "Need a name") )
  $lines = net localgroup $groupName
  $found = $false
  for ($i = 0; $i -lt $lines.Length; $i++ ) {
    if ( $found ) {
      if ( -not $lines[$i].StartsWith("The command completed")) {
        $lines[$i]
      }
    } elseif ( $lines[$i] -match "^----" ) {
      $found = $true;
    }
  }
}

Andre referencer 2


Jay Levys svar blev til en funktion :)


Function Get-LocalGroupMembers
{
    Param(
        [string]
        $server = "."
    )
    Try
    {
        $computer = [ADSI]"WinNT://$( $Server ),computer"
        $computer.psbase.children | 
            where { 
                $\_.psbase.schemaClassName -eq 'group' 
            } |
                ForEach {
                    $GroupName = $\_.Name.ToString()
                    $group =[ADSI]$\_.psbase.Path
                    $group.psbase.Invoke("Members") |
                        foreach {
                            $memberName = $\_.GetType().InvokeMember("Name", 'GetProperty', $null, $\_, $null) -replace "WinNT:", ""

                            $props = @{
                                "LocalGroup" = $GroupName
                                "MemberName" = $memberName
                            }

                            $obj = New-Object -TypeName psobject -Property $props
                            Write-Output $obj
                        } # foreach members
                } # foreach group
    }
    Catch
    {
        Throw
    }
}


At få de lokale gruppemedlemmer


Get-LocalGroupMembers


At få de lokale gruppemedlemmer til en anden maskine


Get-LocalGroupMembers -Server $Computer

Andre referencer 3


Nedenfor er en forbedret version af Shay Levys script, der fungerer for lokale grupper med 'forældreløse' konti, som SID ikke kan løses.


$server = "$env:COMPUTERNAME"
$computer = [ADSI]"WinNT://$server,computer"

$computer.psbase.children | where { $\_.psbase.schemaClassName -eq 'group' } | foreach {
    write-host $\_.name
    write-host "------"
    $group =[ADSI]$\_.psbase.Path
    $group.psbase.Invoke("Members") | foreach {$\_."GetType".Invoke().InvokeMember("Name", 'GetProperty', $null, $\_, $null)}
    write-host
}