如何获取用户所属的所有组?

200
PowerShell的Get-ADGroupMember cmdlet返回特定组的成员。是否有一个cmdlet或属性可以获取特定用户所属的所有组?

1
请参考以下链接:https://dev59.com/sHRB5IYBdhLWcg3wSVi1 和 http://technet.microsoft.com/en-us/library/dd315351.aspx。你确定Get-Member命令做的是你认为它做的事情吗? - tiago2014
2
你可以快速使用 net user /domain username 命令,也可以在 Get Groups in which a user is a member Using PowerShell 中查看其他方法。 - Mohamed
32个回答

4

Get-Member 是一个列出 .NET 对象 成员的命令。这与用户/组成员身份无关。您可以像这样获取当前用户的组成员身份:

PS> [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | 
         Format-Table -auto

BinaryLength AccountDomainSid    Value
------------ ----------------    -----
          28 S-1-5-21-...        S-1-5-21-2229937839-1383249143-3977914998-513
          12                     S-1-1-0
          28 S-1-5-21-...        S-1-5-21-2229937839-1383249143-3977914998-1010
          28 S-1-5-21-...        S-1-5-21-2229937839-1383249143-3977914998-1003
          16                     S-1-5-32-545
...

如果您需要访问任意用户组信息,则使用Quest AD cmdlets是更好的方法,@tiagoinu建议这样做。


4

使用:

Get-ADPrincipalGroupMembership username | select name | export-CSV username.csv

这将命令的输出导入到一个CSV文件中。


4
不需要冗长的脚本,当只有一行简单命令时。 QUEST命令
(Get-QADUser -Identity john -IncludedProperties MemberOf | Select-Object MemberOf).MemberOf

MS AD 命令

(GET-ADUSER –Identity john –Properties MemberOf | Select-Object MemberOf).MemberOf

我发现微软的AD命令更快,但有些人喜欢Quest的命令更好。 Steve

4

我编写了一个名为 Get-ADPrincipalGroupMembershipRecursive 的 PowerShell 函数。它接受用户、计算机、组或服务帐户的 DSN。它从帐户的 memberOf 属性中检索初始组列表,然后递归检查这些组的成员资格。下面是简化的代码。完整的带有注释的源代码可以在此处找到

function Get-ADPrincipalGroupMembershipRecursive( ) {

    Param(
        [string] $dsn,
        [array]$groups = @()
    )

    $obj = Get-ADObject $dsn -Properties memberOf

    foreach( $groupDsn in $obj.memberOf ) {

        $tmpGrp = Get-ADObject $groupDsn -Properties memberOf

        if( ($groups | where { $_.DistinguishedName -eq $groupDsn }).Count -eq 0 ) {
            $groups +=  $tmpGrp           
            $groups = Get-ADPrincipalGroupMembershipRecursive $groupDsn $groups
        }
    }

    return $groups
}

# Simple Example of how to use the function
$username = Read-Host -Prompt "Enter a username"
$groups   = Get-ADPrincipalGroupMembershipRecursive (Get-ADUser $username).DistinguishedName
$groups | Sort-Object -Property name | Format-Table

无法正确地使用用户的默认组。请参见此处:https://stackoverflow.com/questions/53451706/ldap-matching-rule-in-chain-not-working-with-default-ad-groups-domain-users - StackzOfZtuff
这个功能是否也获取所有嵌套的分组? - undefined

4

首先,导入ActiveDirectory模块:

Import-Module ActiveDirectory

然后输入此命令:
Get-ADGroupMember -Identity $group | foreach-object {
    Write-Host $_.SamAccountName
}

这将显示指定组的成员。

5
OP希望得到相反的结果。获取指定用户所属的所有群组。 - 8DH

3
对于本地用户和组(即不在Active Directory中),如果您不想或不被允许或无法安装RSAT和/或Install-WindowsFeature RSAT-AD-PowerShell和/或import-module activedirectory,那么这里有一个纯粹的、预安装的PowerShell(5.1+)方法来完成它。
(注意:下面使用的Get-LocalGroup*仅适用于Powershell v5.1及以上版本。"...v5.1与Windows 10周年更新一同发布于2016年8月2日,并在Windows Server 2016中发布。...[F]对于Windows 7、Windows Server 2008、Windows Server 2008 R2、Windows Server 2012和Windows Server 2012 R2,[它]在2017年1月19日发布。" (wikipedia))
$username = "user002"
Get-LocalGroup | ForEach-Object {
    # the usernames are returned in the string form "computername\username"
    if (Get-LocalGroupMember -Group $_ | Where-Object name -like "*\$username") {
        $_.name
    } 
}

示例输出:

Administrators
Users

此方法与Active Directory无关。 - Slogmeister Extraordinaire
@超级口号大师 我的理由是,一些搜索这个问题的互联网用户会对本地组感兴趣,而不是活动目录。 - john v kumpf
@johnvkrumpf 已经理解,但是你的回答并没有表明这不是一个Active Directory解决方案。它暗示如果您无法加载AD模块/工具,则此方法可行,但在此情况下不可行。问题明确要求AD解决方案。我不反对你的推理,因为我也做过很多次。但请考虑读者可能不明白你的答案不能与AD一起使用,并且尝试时会非常沮丧。修改你的答案以清楚地表明这是一个非AD解决方案,我会点赞的。 - Slogmeister Extraordinaire

3

这只是一行代码:

(get-aduser joe.bloggs -properties *).memberof

结束啦 :)


将其导入到 select -expandproperty memberof 中,可以使输出结果更易读/有用。 - Ben Thul

2
下面的内容已经很好了:
get-aduser $username -Properties memberof | select -expand memberof

如果你有一个用户列表:
$list = 'administrator','testuser1','testuser2'
$list | `
    %{  
        $user = $_; 
        get-aduser $user -Properties memberof | `
        select -expand memberof | `
        %{new-object PSObject -property @{User=$user;Group=$_;}} `
    }

#Get-PromptedUser-AllGroupMemberships.ps1 $user = Read-host -prompt "你需要查询哪个用户的所有组成员关系?" Get-ADPrincipalGroupMembership $user | Format-Table -auto - undefined

2
(Get-ADUser $env:username -Properties MemberOf).MemberOf | % {$_.split(",")[0].replace("CN=","")}

Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam

2
嗨,这个问题已经有了答案,如果你有不同的解决方案,并且在某些方面更好,请尝试解释它或者说明何时使用它比批准的答案更好。 - SpaceDogCS

1
当您没有查询其他成员组的权限,但有查询组成员的权限时,可以执行以下操作来建立用户访问哪些组的地图。
$groups = get-adgroup -Filter * | sort name | select Name
$users = @{}
foreach($group in $groups) {
    $groupUsers = @()
    $groupUsers = Get-ADGroupMember -Identity $group.Name | Select-Object SamAccountName
    $groupUsers | % {
        if(!$users.ContainsKey($_.SamAccountName)){
            $users[$_.SamAccountName] = @()
        }
        ($users[$_.SamAccountName]) += ($group.Name)
    }
}

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