有没有一种简单的方法使用PowerShell来显示所有在计算机上活动的本地Windows组以及属于这些组的用户? 这个问题的第二部分是如果可以扩展到一次查看多台机器的话。
实际上你可以用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 }
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; } } }
杰伊·利维的答案变成了一个函数:)
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
以下是Shay Levy的脚本的改进版本,适用于那些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 }