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

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个回答

366

Get-ADPrincipalGroupMembership 可以做到这一点,它来自于Active Directory模块。您需要安装该模块或在Windows 10+上安装RSAT才能运行下面的命令。

Get-ADPrincipalGroupMembership username | select name

name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam

2
这刚刚让我避免了使用最复杂和冗长的方法来找到它。知道PowerShell会有类似的东西,但是无论如何都找不到。+1 - user275560
16
请注意,这取决于ActiveDirectory模块是否可用。这在客户端机器上运行PowerShell脚本或下级客户端上不一定适用。如果您想要这样做,请使用此解决方案 - Daniel.S
9
以上内容给我带来了错误(“服务器由于内部错误无法处理请求” - 可能是服务器上无法使用的功能)。但get-aduser $username -Properties memberof | select -expand memberof很好地运作了。 - JohnLBevan
6
如果您使用的是Windows 10工作站而不是服务器,请从此处安装RSAT,然后在PowerShell命令行中键入import-module activedirectory,这样应该就可以运行了。 - James Toomey
5
如果未安装该模块:请执行Install-WindowsFeature RSAT-AD-PowerShell进行安装。 - Preben Huybrechts
显示剩余12条评论

142

无需模块,单行代码即可使用当前登录用户:

(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf

对这篇VBScript/PowerShell文章赞一个:http://technet.microsoft.com/en-us/library/ff730963.aspx


8
谢谢,我很感激这个无模块版本。我只是将变量从 $env:username 更改为 $username,并使用 $username = "testuser" 进行设置,以便为其他用户查找轻松进行变量替换。 - p̻̻̥r̥̻̥o̻j̤͛ec͔t̞dp
1
刚刚通过谷歌又回到这里了!在没有AD工具的情况下,仍然可以在随机情况下派上用场。 - Nathan
无法正确处理用户“默认组”的嵌套成员身份。请参见此处:https://stackoverflow.com/questions/53451706/ldap-matching-rule-in-chain-not-working-with-default-ad-groups-domain-users - StackzOfZtuff
要获取(已排序的)纯组列表,您可以运行 (New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf -replace "CN=(.*?),.*" ,"``$1" | Sort - CraZ

63

一个更加简洁的方法,用来获取当前已登录用户的组成员身份。

我在这篇博客文章中发现了这种方法:http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/

([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof

使用正则表达式剥离LDAP乱七八糟的内容,只保留组名的更好版本:

([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof -replace '^CN=([^,]+).+$','$1'

有关如何使用[ADSISEARCHER]类型加速器的详细信息,请参阅 scripting guy 博客:http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type-accelerator-to-search-active-directory.aspx


3
这两个都给我错误:使用“0”个参数调用“FindOne”时出现异常:“samaccountname=搜索过滤器无效。” - Dallas
奇怪......我刚刚再次测试了一下,在完全不同的环境中使用 Windows 7,它在这里也可以正常工作。 - Daniel.S
1
我刚刚又尝试了一下,仍然在Win 7上,它可以正常工作。也许我第一次尝试时打错了字。感谢您添加了替换以剥离森林“废话”。 - Dallas
8
很好用,添加| Sort-Object可以使其更易读。 - Martin Hollingsworth
无法正确处理用户“默认组”的嵌套成员身份。请参见此处:https://stackoverflow.com/questions/53451706/ldap-matching-rule-in-chain-not-working-with-default-ad-groups-domain-users - StackzOfZtuff

44

从CMD中的老派方式:

net user mst999 /domain 

1
它也可以在客户端机器上工作,无需额外的AD工具。 - Rast
17
很遗憾,如果你的群组名称很长(即超过21个字符),它们将被截断。 - kiltannen

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

谢谢!这个可行。唯一的缺点是返回的值是一个字符串。 - shaiss
3
"get-adgroup"将输出组对象。太棒了! - 8DH
2
使用$env:USERNAME代替,以获取当前登录用户的用户名。 - Dave Lucre
1
无法使用默认组。请参见:https://stackoverflow.com/questions/53451706/ldap-matching-rule-in-chain-not-working-with-default-ad-groups-domain-users - StackzOfZtuff
这个才是正确的,朋友们。所有其他的答案要么根本不起作用,要么需要其他工具,要么截断输出,要么太复杂。 - undefined

21
这应该会为您提供有关当前用户的详细信息。不需要使用Powershell。 < p >whoami /groups


2
这仅对已登录用户的AD组成员身份有帮助。但是,如果您需要另一个用户或正在从提升的 shell 运行,则此方法无效。 - gregg
这并不是被问到的问题:“如何获取用户所属的所有群组?” - undefined

13

如果您无法使用Get-ADPrincipalGroupMembership,请尝试以该用户身份登录,然后使用。

$id = [Security.Principal.WindowsIdentity]::GetCurrent()
$groups = $id.Groups | foreach-object {$_.Translate([Security.Principal.NTAccount])}
$groups | select *

如果您使用类似 $id = [Security.Principal.WindowsIdentity]("username") 的东西,您也不需要作为用户登录。 - Bitcoin Murderous Maniac
2
这可以简化为一行代码:[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | % {$_.Translate([Security.Principal.NTAccount])} - alx9r
那个回答太糟糕了,因为那违反了每家公司的安全规定,绝对不能这样做。 - undefined
1
@PatrickBurwell 我明白你的意思。我更多地考虑的是你无法访问某个东西,但你的同事可以,或者你通过TeamViewer之类的工具帮助他人...而不是有人在用户不知情的情况下对许多用户进行操作。 - undefined

9

虽然这里有很多优秀的答案,但我个人正在寻找的其中一个丢失了。一旦我弄清楚了,我认为我应该发布它,以防我以后想找到它,或者它在某个时候实际上能帮助其他人:

Get-ADPrincipalGroupMembership username | Format-Table -auto

一种呈现方式是指定您感兴趣的各个列,例如:

这种方法的另一种呈现方式是指定您感兴趣的各个列,例如:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

这将给出所有该用户名所属的AD组 - 但也呈现了每个组的默认属性,以表格形式漂亮地格式化。
这样做的关键好处是你可以一眼看出哪些是分发列表,哪些是安全组。你还可以一眼看出哪些是通用组,哪些是域本地组,哪些是全局组。
为什么你会关心最后一个问题呢?
- 通用组是包含来自其森林中任何域的用户、组和计算机成员的安全或分发组。你可以在森林中的任何域上为通用安全组授予权限和权限。 - 全局组是一个可以在其自己的域中、成员服务器和域的工作站中使用的组,并且可以在信任域中使用。在所有这些位置,您都可以为全局组授予权限和权限,并且全局组可以成为本地组的成员。然而,全局组可能包含仅来自其自己域的用户帐户。 - 域本地组是一个安全或分发组,它可以包含来自其自己域、森林中任何域的通用组、全局组或其他域本地组以及帐户。您可以在仅该域本地组所在的同一域中的资源上为域本地安全组授予权限和权限。

1
我同意。如果您想在PowerShell中对输出执行某些操作(这是系统管理员可能会做的),那么这是更好的解决方案。而且比那个被提议并获得100多个赞的非常优雅的一行代码解决方案容易记忆得多。 - IT M
2
非常好,表格输出很漂亮。"这将显示用户名所属的所有AD组 - 并将每个组的默认属性以漂亮的表格格式呈现。" - undefined

5

Get-Member不是用于获取用户组成员身份的。如果您想要获取用户在本地系统中所属的组列表,可以通过以下方式实现:

$query = "ASSOCIATORS OF {Win32_Account.Name='DemoUser1',Domain='DomainName'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account"

Get-WMIObject -Query $query | Select Name

在上面的查询中,将DemoUser1替换为您想要的用户名,将DomainName替换为您的本地计算机名称或域名。

1
当环境中存在多个用户和群组时,此查询非常耗时且响应速度非常慢。 - randeepsp
谁在编辑答案,一定要确保以正确的方式进行编辑。我建议OP用他想要的任何用户名替换DemoUser1。而你完全改变了那个意思。 - ravikanth
这可能会慢一些,但它能得到正确的回应。 - undefined

5

获取用户的组成员身份:

$strUserName = "Primoz"
$strUser = get-qaduser -SamAccountName $strUserName
$strUser.memberof

请参阅获取用户组成员身份

同时也可以查看Quest公司的免费Active Directory PowerShell命令.

[编辑: Get-ADPrincipalGroupMembership 命令已经包含在Windows 2008 R2的Powershell v2中。请参阅kstrauss的答案。]


2
实际上,使用Quest cmdlets有一种更简单的方法:Get-QADGroup -Contains Primoz。 - fenster
18
由于Get-ADPrincipalGroupMembership现在已经内置到PowerShell中,因此这不再是最佳答案。 - Rob Cannon
1
因为使用Get-ADPrincipalGroupMembership会更好,所以被投票否决。我想撤销这个反对票,但我不能。我将编辑答案,指出现在已经存在内置选项。 - Abraham
现在你可以很容易地使用: #Get-PromptedUser-AllGroupMemberships.ps1 $user = Read-host -prompt "你需要查看哪个用户的所有组成员身份?" Get-ADPrincipalGroupMembership $user | Format-Table -auto - undefined

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