PowerShell - 列出本地用户及其所属组

29
我想生成一个报告,列出所有本地用户及其所属组(如:users、power users、administrators等)。
我可以通过以下方式获取用户信息:
$adsi = [ADSI]"WinNT://."
$adsi.psbase.children | where {$_.psbase.schemaClassName -match "user"} | select @{n="Name";e={$_.name}}

但我不知道如何检索它们的组。提前致谢。

6个回答

41

6
您想在查询中添加过滤器,以仅列出本地帐户:
  • 过滤器为“LocalAccount = True”。
- user337598

31
$adsi = [ADSI]"WinNT://$env:COMPUTERNAME"
$adsi.Children | where {$_.SchemaClassName -eq 'user'} | Foreach-Object {
    $groups = $_.Groups() | Foreach-Object {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
    $_ | Select-Object @{n='UserName';e={$_.Name}},@{n='Groups';e={$groups -join ';'}}
}

24

作为对2010年优秀回答的替代更新:

现在,您可以使用Microsoft.PowerShell.LocalAccounts 模块中的 Get-LocalGroupMemberGet-LocalGroupGet-LocalUser 等命令获取和映射用户和组,该模块适用于 PowerShell 5.1 及以上版本。

示例:

PS C:\WINDOWS\system32> Get-LocalGroupMember -name users

ObjectClass Name                             PrincipalSource 
----------- ----                             --------------- 
User        DESKTOP-R05QDNL\someUser1        Local           
User        DESKTOP-R05QDNL\someUser2        MicrosoftAccount
Group       NT AUTHORITY\INTERACTIVE         Unknown  
你可以将Get-LocalUser与此相结合。别名glu也可以使用。大多数新的cmdlet都有别名。
以防有些人想知道(我知道你没有问过这个),例如可以像这样添加用户:
$description = "Netshare user"
$userName = "Test User"
$user = "test.user"
$pwd = "pwd123"

New-LocalUser $user -Password (ConvertTo-SecureString $pwd -AsPlainText -Force) -FullName $userName -Description $description

谢谢,@DavidMiguel - 我已将此信息添加到答案中。 - mklement0
谢谢,@Vish - 我已经相应地更新了答案。 - mklement0

3

使用此功能可获取包含本地用户及其所属组的数组:

Get-LocalUser | 
    ForEach-Object { 
        $user = $_
        return [PSCustomObject]@{ 
            "User"   = $user.Name
            "Groups" = Get-LocalGroup | Where-Object {  $user.SID -in ($_ | Get-LocalGroupMember | Select-Object -ExpandProperty "SID") } | Select-Object -ExpandProperty "Name"
        } 
    }

获取包含本地组及其成员的数组:
Get-LocalGroup | 
    ForEach-Object {
        $group = $_
        return [PSCustomObject]@{ 
            "Group"   = $group.Name
            "Members" = $group | Get-LocalGroupMember | Select-Object -ExpandProperty "Name"
        } 
    } 

2

扩展mjswensen的答案,没有过滤器的命令可能需要几分钟的时间,但有过滤器的命令几乎是瞬间完成的。

PowerShell - 列出本地用户账户

快速方法

Get-WmiObject -Class Win32_UserAccount -Filter  "LocalAccount='True'" | select name, fullname

缓慢的方式

Get-WmiObject -Class Win32_UserAccount |? {$_.localaccount -eq $true} | select name, fullname

0

试试这个 :)

Get-LocalGroup | %{ $groups = "$(Get-LocalGroupMember -Group $_.Name | %{ $_.Name } | Out-String)"; Write-Output "$($_.Name)>`r`n$($groups)`r`n" }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接