2009-06-09 15 views
10

Gibt es eine einfache Möglichkeit, Powershell mit allen lokalen Windows-Gruppen zu zeigen, die auf einer Maschine und den Benutzer aktiv sind, die ein Teil dieser Gruppen sind? Ein zweiter Teil dieser Frage wäre, wenn es erweitert werden könnte, um mehr als eine Maschine gleichzeitig zu betrachten.Benutzer und lokale Gruppen Melden Sie sich mit Powershell an?

Antwort

13

In der Tat Sie mit dem ADSI Typ Verknüpfung kann und der WinNT Moniker. Hier ist ein Beispiel Gruppen und Mitglieder von Ihrer eigenen Maschine zur Liste:

$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 
} 
+0

Ich erhalte einen Fehler mit der Anweisung $ group = [ADSI] $ _. Pfad – msvcyc

+0

fügen Sie psbase vor Pfad hinzu (d. H. [ADSI] $ _. Psbase.Path) –

+0

omg danke ich hätte dies nie selbst gefunden! Gibt es eine Möglichkeit zu wissen, ob die Mitglieder der lokalen Gruppe Benutzer oder Gruppe sind? (Ich möchte die Mitglieder der Administratoren localgroup aufzulisten und wenn ein Mitglied eine domaingroup Liste seiner Mitglieder) –

7

Powershell hat keine inhärente Unterstützung für eine solche Funktion. Es ist jedoch einfach, den "net localgroup" -Befehl mit einigen Powershell-Funktionen zu umschließen und somit in der Pipeline zu aktivieren.

Lokale Interessen Gruppen

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

Lokale Interessen Gruppenmitglieder

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; 
    } 
    } 
} 
+0

Die Schleife sollte einmal brechen trifft die Zeile "Der Befehl ist abgeschlossen", andernfalls wird eine leere Zeichenfolge als letztes Element des Arrays zurückgegeben, da die letzte Zeile in der Ausgabe leer ist. – bradvido

0

Im Folgenden ist eine verbesserte Version von Shay Levys Skript, das für lokale Gruppen mit „verwaisten“ Konten funktioniert die SIDs nicht aufgelöst werden kann.

$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 
} 
1

Jay Levy Antwort verwandelte sich in eine 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 
    } 
} 

Um die lokalen Gruppenmitglieder

Get-LocalGroupMembers 

Um die lokalen Gruppenmitglieder für eine andere Maschine

Get-LocalGroupMembers -Server $Computer 
zu erhalten zu erhalten
+0

Wie bearbeite ich diese Funktion, um die Ergebnisse in eine Text- oder CSV-Datei auszugeben? – salvationishere

Verwandte Themen