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

Pri*_*moz 113 powershell active-directory powershell-2.0

PowerShell的Get-ADGroupMembercmdlet返回特定组的成员.是否有cmdlet或属性来获取特定用户所属的所有组?


我修正了我的错误:Get-Member应该是Get-ADGroupMember.

小智 250

Get-ADPrincipalGroupMembership将执行此操作.

Get-ADPrincipalGroupMembership username | select name

name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这取决于可用的ActiveDirectory模块.这不一定适用于运行PowerShell脚本的客户端计算机或下层客户端.如果您想这样做,请使用[此解决方案](/sf/answers/1673159281/). (6认同)
  • 上面给了我错误("由于内部错误,服务器无法处理请求" - 可能是服务器上没有的功能).`get-aduser $ username -Properties memberof | select -expand memberof`工作得很好. (5认同)
  • 如果您使用的是Windows 10工作站而不是服务器,请从[此处](https://www.microsoft.com/en-us/download/details.aspx?id=45520)安装RSAT,然后键入`import - powershell命令行上的-module activedirectory`,然后应该运行. (4认同)
  • 如果未安装该模块:Install-WindowsFeature RSAT-AD-PowerShell (3认同)

Can*_*oas 75

单行,无需模块,使用当前登录用户:

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

对此vbs/powershell文章的质疑:http://technet.microsoft.com/en-us/library/ff730963.aspx

  • 谢谢,我很欣赏这个无模块版本.我只是将变量从`$ env:username`更改为`$ username`并使用`$ username ="testuser"`进行设置,以便轻松地对其他用户查找进行变量替换. (5认同)
  • 我希望我能不止一次地投票! (2认同)

Dan*_*l.S 40

Canoas发布的更简洁的替代方案,用于获取当前登录用户的组成员资格.

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

([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof
Run Code Online (Sandbox Code Playgroud)

一个更好的版本,它使用正则表达式来剥离LDAP guff并仅留下组名:

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

有关使用[ADSISEARCHER]类型加速器的更多详细信息,请访问脚本专家博客:http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type -accelerator到搜索主动directory.aspx

  • 这两个都给我错误:使用“0”参数调用“FindOne”时出现异常:“samaccountname =搜索过滤器无效。” (3认同)
  • 效果很好,追加`| Sort-Object`使其更具可读性. (2认同)

小智 27

CMD的老派方式:

net user mst999 /domain 
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是-如果您的群组名称很长(即> 21个字符),则会截断它们... (3认同)

小智 24

(GET-ADUSER –Identity USERNAME –Properties MemberOf | Select-Object MemberOf).MemberOf
Run Code Online (Sandbox Code Playgroud)

  • | get-adgroup将输出组对象.辉煌! (3认同)
  • 或者,使用 $env:USERNAME 来获取当前登录用户的用户名 (2认同)

and*_*ate 11

如果您无法让 Get-ADPrincipalGroupMembership 为您工作,您可以尝试以该用户身份登录,然后使用。

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

  • 这很好地缩短为一行代码 `[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | % {$_.Translate([Security.Principal.NTAccount])}`. (2认同)

Nay*_*yan 10

这应该为您提供当前用户的详细信息。不需要Powershell。

whoami /groups

  • 这仅对登录的用户 AD 组成员身份有用。但是,如果您需要另一个用户或从提升的 shell 运行,则这没有帮助。 (2认同)

kil*_*nen 9

虽然这里有很多优秀的答案,但我个人一直在寻找的答案却缺失了。一旦我弄清楚了——我想我应该发布它,以防我以后想找到它,或者它实际上在某个时候能够帮助别人:

Get-ADPrincipalGroupMembership username | Format-Table -auto
Run Code Online (Sandbox Code Playgroud)

呈现此内容的第二种方法是指定您感兴趣的各个列,例如:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory
Run Code Online (Sandbox Code Playgroud)

这给出了用户名所属的所有 AD 组 - 而且还以表格的形式呈现了每个组的所有默认属性。

这给您带来的主要好处是您可以一目了然地看到哪些是通讯组列表,哪些是安全组。您可以进一步一目了然地看到哪些是通用的,哪些是 DomainLocal 的,哪些是全局的。
你为什么要关心最后一点?

  • 通用组是一个安全组或通讯组,包含来自其林中任何域的用户、组和计算机作为成员。您可以向通用安全组授予对林中任何域中的资源的权利和权限。
  • 全局组是可以在自己的域、域的成员服务器和工作站以及信任域中使用的组。在所有这些位置中,您可以授予全局组权利和权限,并且全局组可以成为本地组的成员。但是,全局组可以包含仅来自其自己的域的用户帐户。
  • 域本地组是一个安全组或通讯组,可以包含通用组、全局组、来自其自己域的其他域本地组以及来自林中任何域的帐户。您可以向域本地安全组授予对仅驻留在域本地组所在同一域中的资源的权利和权限。

  • 优秀、漂亮的表格输出,“这给出了用户名所属的所有 AD 组 - 而且还以表格的形式呈现了每个组的所有默认属性。” (2认同)

tia*_*014 5

获取用户的组成员资格:

$strUserName = "Primoz"
$strUser = get-qaduser -SamAccountName $strUserName
$strUser.memberof
Run Code Online (Sandbox Code Playgroud)

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

但另请参阅Quest的Active Directory免费PowerShell命令.

[ 编辑:Get-ADPrincipalGroupMembership命令包含在自Windows 2008 R2 v2以来的Powershell中.请参阅kstrauss的回答.]

  • 这不再是最好的答案,因为Get-ADPrincipalGroupMembership现已内置到PowerShell中 (18认同)
  • 实际上,使用Quest cmdlet有一种更简单的方法:Get-QADGroup -Contains Primoz (2认同)

rav*_*nth 5

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

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

Get-WMIObject -Query $query | Select Name
Run Code Online (Sandbox Code Playgroud)

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