Есть ли простой способ использования powershell для отображения всех локальных групп Windows, которые активны на машине, и пользователей, входящих в эти группы? Вторая часть этого вопроса будет заключаться в том, что его можно расширить, чтобы просмотреть несколько машин за раз.
Отчеты пользователей и локальных групп с использованием Powershell?
Ответ 1
Фактически вы можете использовать ярлык типа ADSI и прозвище WinNT. Здесь приведен пример списка групп и членов из вашей собственной машины:
$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
}
Ответ 2
Powershell не имеет встроенной поддержки такой функции. Однако легко обернуть команду "net localgroup" с помощью нескольких функций powershell и тем самым включить ее в конвейер.
Получить локальные группы
function Get-LocalGroups() {
net localgroup | ?{ $_ -match "^\*.*" } | %{ $_.SubString(1) };
}
Получить членов локальной группы
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;
}
}
}
Ответ 3
Ответ Джея Леви превратился в функцию:)
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
}
}
Чтобы получить локальные члены группы
Get-LocalGroupMembers
Чтобы получить локальные члены группы для другого компьютера
Get-LocalGroupMembers -Server $Computer
Ответ 4
Ниже представлена улучшенная версия Shay Levy script, которая работает для локальных групп с "потерянными" учетными записями, которые SID не могут быть разрешены.
$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
}