C'è un modo semplice con PowerShell per mostrare tutti i gruppi di Windows locali che sono attivi su una macchina e gli utenti che fanno parte di quei gruppi? Una seconda parte di questa domanda sarebbe se si potesse estendere l'analisi a più di una macchina alla volta.Report utenti e gruppi locali utilizzando Powershell?
risposta
In realtà è possibile con il tipo di collegamento ADSI e il moniker WinNT. Ecco un esempio per elencare i gruppi e membri dalla propria macchina:
$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
}
PowerShell non ha alcun supporto intrinseco per tale funzione. Tuttavia è facile racchiudere il comando "net localgroup" con un paio di funzioni di PowerShell e quindi abilitarlo nella pipeline.
Diventa gruppi locali
function Get-LocalGroups() {
net localgroup | ?{ $_ -match "^\*.*" } | %{ $_.SubString(1) };
}
Gli iscritti del Gruppo Locale
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;
}
}
}
Il ciclo dovrebbe interrompersi una volta colpisce la riga "Il comando completato", altrimenti restituirà una stringa vuota come ultimo elemento dell'array perché l'ultima riga nell'output è vuota. – bradvido
Di seguito è una versione migliorata del copione di Shay Levy che funziona per i gruppi locali con account "orfani" che SID non può essere risolto.
$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
}
risposta di Jay Levy si trasformò in una funzione :)
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
}
}
Per ottenere i membri del gruppo locale
Get-LocalGroupMembers
Per ottenere i membri del gruppo locale per un'altra macchina
Get-LocalGroupMembers -Server $Computer
Come si modifica questa funzione per produrre i risultati in un file di testo o csv? – salvationishere
Mi viene visualizzato un errore con l'istruzione $ group = [ADSI] $ _. Path – msvcyc
aggiungi psbase davanti al percorso (ad esempio [ADSI] $ _. Psbase.Path) –
grazie mille non l'avrei mai trovato da solo! C'è un modo per sapere se i membri del gruppo locale sono utenti o gruppi? (Voglio elencare i membri degli amministratori del gruppo locale e se un membro è un domaingroup elenca i suoi membri) –