How to get all groups that a user is a member of?
PowerShell的
我更正了我的错误:
Get-ADPrincipalGroupMembership将执行此操作。
1 2 3 4 5 6 7 8 9 10 | Get-ADPrincipalGroupMembership username | select name name ---- Domain Users Domain Computers Workstation Admins Company Users Company Developers AutomatedProcessingTeam |
单行,无需模块,使用当前登录的用户:
1 | (New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf |
此vbs / powershell文章的Qudos:??http://technet.microsoft.com/zh-cn/library/ff730963.aspx
一种比Canoas发布的更简洁的替代方法,以获得当前登录用户的组成员身份。
我在此博客文章中遇到了这种方法:http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/
1 | ([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof |
更好的版本使用正则表达式剥离LDAP guff,仅保留组名:
1 | ([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof -replace '^CN=([^,]+).+$','$1' |
可以在脚本专家博客上找到有关使用[ADSISEARCHER]类型加速器的更多详细信息:http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type -accelerator-to-search-active-directory.aspx
从CMD过去的方式:
1 | net user mst999 /domain |
1 | (GET-ADUSER –Identity USERNAME –Properties MemberOf | Select-Object MemberOf).MemberOf |
如果您无法使Get-ADPrincipalGroupMembership正常工作,则可以尝试以该用户身份登录然后使用。
1 2 3 | $id = [Security.Principal.WindowsIdentity]::GetCurrent() $groups = $id.Groups | foreach-object {$_.Translate([Security.Principal.NTAccount])} $groups | select * |
获取用户的组成员身份:
1 2 3 | $strUserName ="Primoz" $strUser = get-qaduser -SamAccountName $strUserName $strUser.memberof |
请参阅获取用户的组成员身份
但另请参阅Quest的Active Directory的免费PowerShell命令。
[编辑:Get-ADPrincipalGroupMembership命令自v2与Windows 2008 R2起包含在Powershell中。请参阅下面的kstrauss回答。]
1 2 3 4 5 6 7 8 9 10 11 | 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 ... |
如果您需要访问任意用户的组信息,则@tiagoinu建议使用Quest AD cmdlet是更好的方法。
Get-Member不是用于获取用户的组成员身份。如果要获取用户在本地系统上所属的组的列表,可以通过以下方法实现:
1 2 3 | $query ="ASSOCIATORS OF {Win32_Account.Name='DemoUser1',Domain='DomainName'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account" Get-WMIObject -Query $query | Select Name |
在上面的查询中,将DemoUser1替换为所需的用户名,将DomainName替换为本地计算机名或域名。
首先,导入activedirectory模块:
1 | import-module activedirectory |
然后发出以下命令:
1 2 3 |
这将显示指定组的成员。
如果只是一个简单的衬纸,则无需长脚本。
QUEST命令
1 | (Get-QADUser -Identity john -IncludedProperties MemberOf | Select-Object MemberOf).MemberOf |
MS AD命令
1 | (GET-ADUSER –Identity john –Properties MemberOf | Select-Object MemberOf).MemberOf |
我发现MS AD cmd更快,但有些人更喜欢Quest的人。
史蒂夫
采用:
1 | Get-ADPrincipalGroupMembership username | select name | export-CSV username.csv |
这会将命令的输出传递到CSV文件中。
这只是一行:
1 | (get-aduser joe.bloggs -properties *).memberof |
结束 :)
我编写了一个名为Get-ADPrincipalGroupMembershipRecursive的PowerShell函数。它接受用户,计算机,组或服务帐户的DSN。它从帐户的memberOf属性中检索组的初始列表,然后递归检查这些组的成员资格。缩写代码如下。完整的源代码和注释可以在这里找到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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 |
以下效果很好:
1 | get-aduser $username -Properties memberof | select -expand memberof |
如果您有用户列表:
1 2 3 4 5 6 7 8 |
这应该为您提供当前用户的详细信息。 不需要Powershell。
尽管这里有许多出色的答案,但我个人一直想找到一个答案。一旦弄清楚了-我想应该将其发布,以备日后找到,否则它实际上可以在某些时候帮助其他人:
1 | Get-ADPrincipalGroupMembership username | Format-Table -auto |
呈现这种情况的第二种方法是指定您感兴趣的各个列,例如:
1 | Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory |
这为用户名所属的所有AD组提供了-而且还以表格的形式显示了每个组的所有默认属性。
这给您的主要好处是您可以一目了然地看到哪些是通讯组列表,哪些是安全组。您可以一目了然地看到哪些是通用的,哪些是DomainLocal的,哪些是全球的。
您为什么还要关心这最后一点?
-
通用组是包含以下内容的安全组或通讯组
其林中任何域中的用户,组和计算机
成员。您可以授予通用安全组权限,并
对林中任何域中资源的权限。 -
全局组是可以在其自己的域中使用的组
服务器和域的工作站中以及信任域中。
在所有这些位置,您都可以授予全局组权限,
权限,并且全局组可以成为本地组的成员。
但是,全局组可以包含仅来自
自己的域名。 -
域本地组是一个安全组或分发组,可以
包含通用组,全局组,其他域本地组
来自其自己的域,以及来自林中任何域的帐户。您
可以授予域本地安全组的权限
仅驻留在本地域所在的同一域中的资源
组位于。
Get-QADUser -SamAccountName登录ID | %{$ _。MemberOf} | Get-QADGroup |选择名字
我无法使以下内容适用于特定用户:
1 | Get-ADPrincipalGroupMembership username |
它抛出了一个我不愿意解决的错误。
但是,我确实使用Get-ADUser提出了另一种解决方案。我更喜欢它,因为如果您不知道帐户名,则可以根据用户的真实姓名使用通配符来获取它。只需填写PartOfUsersName即可。
1 2 3 4 5 6 7 8 9 10 | #Get the groups that list of users are the member of using a wildcard search [string]$UserNameLike ="*PartOfUsersName*" #Use * for wildcards here [array]$AccountNames = $(Get-ADUser -Filter {Name -like $UserNameLike}).SamAccountName ForEach ($AccountName In $AccountNames) { Write-Host"`nGETTING GROUPS FOR" $AccountName.ToUpper()":" (Get-ADUser -Identity $AccountName -Properties MemberOf|select MemberOf).MemberOf| Get-ADGroup|select Name|sort name } |
schmeckendeugler和8DH的巨大道具让我着迷于此解决方案。 +1。
几乎所有上述解决方案都使用
我用下面的方法。有点间接,但达到了我的目的。
列出所有可用的组
然后列出用户所属的组
然后可以通过检查
要使其递归,可以使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <# .SYNOPSIS Get all the groups that a user is MemberOf. .DESCRIPTION This script retrieves all the groups that a user is MemberOf in a recursive way. .PARAMETER SamAccountName The name of the user you want to check #> Param ( [String]$SamAccountName = 'test', $DomainUsersGroup = 'CN=Domain Users,CN=Users,DC=domain,DC=net' ) Function Get-ADMemberOf { Param ( [Parameter(ValueFromPipeline)] [PSObject[]]$Group, [String]$DomainUsersGroup = 'CN=Domain Users,CN=Users,DC=grouphc,DC=net' ) Process { foreach ($G in $Group) { $G | Get-ADGroup | Select -ExpandProperty Name Get-ADGroup $G -Properties MemberOf| Select-Object Memberof | ForEach-Object { Get-ADMemberOf $_.Memberof } } } } $Groups = Get-ADUser $SamAccountName -Properties MemberOf | Select-Object -ExpandProperty MemberOf $Groups += $DomainUsersGroup $Groups | Get-ADMemberOf | Select -Unique | Sort-Object |
这是获取名称的最简单方法:
distinguishedName : CN=users,OU=test,DC=SomeWhere
GroupCategory : Security
GroupScope : Global
name : testGroup
objectClass : group
objectGUID : 2130ed49-24c4-4a17-88e6-dd4477d15a4c
SamAccountName : testGroup
SID : S-1-5-21-2114067515-1964795913-1973001494-71628
添加一条select语句以修剪响应或使OU中的每个用户成为用户所在的每个组:
Get-ADPrincipalGroupMembership $user.samaccountName | select name}
1 2 3 4 5 6 7 |
更改-SearchBase的值以反映从以下列表中列出用户所需的OU:
这将列出该OU中的所有用户,并向您显示他们所属的组。
使用用户输入和精美的输出格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [CmdletBinding(SupportsShouldProcess=$True)] Param( [Parameter(Mandatory = $True)] [String]$UserName ) Import-Module ActiveDirectory If ($UserName) { $UserName = $UserName.ToUpper().Trim() $Res = (Get-ADPrincipalGroupMembership $UserName | Measure-Object).Count If ($Res -GT 0) { Write-Output"`n" Write-Output"$UserName AD Group Membership:" Write-Output"===========================================================" Get-ADPrincipalGroupMembership $UserName | Select-Object -Property Name, GroupScope, GroupCategory | Sort-Object -Property Name | FT -A } } |
如果您没有特权咨询其他成员组,但确实有特权咨询组成员,则可以执行以下操作来构建一个地图,该地图可以确定哪些用户有权访问哪些组。
1 2 3 4 5 6 7 8 9 10 11 12 | $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) } } |
将其放在此处以供将来参考。我正在进行电子邮件迁移。我需要了解每个用户帐户及其各自的组成员身份,并且还需要了解每个组及其各自的成员。
我正在使用下面的代码块为每个用户的组成员资格输出CSV。
1 2 3 4 5 6 7 8 9 | Get-ADUser -Filter * |` ForEach-Object { ` $FileName = $_.SamAccountName +".csv" ; ` $FileName ; ` Get-ADPrincipalGroupMembership $_ | ` Select-Object -Property SamAccountName, name, GroupScope, GroupCategory | ` Sort-Object -Property SamAccountName | ` Export-Csv -Path $FileName -Encoding ASCII ; ` } |
小组及其各自成员的导出过程有些复杂,但是以下工作可行。输出文件名包括组的类型。因此,我需要的电子邮件通讯组是(应该是)通用和全局通讯组。我应该能够删除或移动不需要的结果TXT文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Get-ADGroup -Filter * | ` Select-Object -Property Name, DistinguishedName, GroupScope, GroupCategory | ` Sort-Object -Property GroupScope, GroupCategory, Name | ` Export-Csv -Path ADGroupsNew.csv -Encoding ASCII $MyCSV = Import-Csv -Path .\\ADGroupsNew.csv -Encoding ASCII $MyCSV | ` ForEach-Object { ` $FN = $_.GroupScope +"," + $_.GroupCategory +"," + $_.Name +".txt" ; ` $FN ; ` Get-ADGroupMember -Identity $_.DistinguishedName | ` Out-File -FilePath $FN -Encoding ASCII ; $FN=""; ` } |
研究提出的所有评论为我提供了一个起点(为此感谢),但给我留下了几个未解决的问题。结果,这就是我的答案。提供的代码段比要求的功能多了一点,但提供了有用的调试信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | [array] $script:groupsdns = @() function Get-ADPrincipalGroupMembershipRecursive() { Param( [string] $dn, [int] $level = 0, [array] $groups = @() ) #if(($groupsdns | where { $_.DistinguishedName -eq $dn }).Count -ne 0 ) { return $groups } # dependency on next statement #$groupsdns += (Get-ADObject $dn -Properties MemberOf) # Get-ADObject cannot find an object with identity if ($script:groupsdns.Contains($dn)) { return $groups } $script:groupsdns += $dn $mo = $Null $mo = Get-ADObject $dn -Properties MemberOf # Get-ADObject cannot find an object with identity $group = ($dn +" (" + $level.ToString()) if ($mo -eq $Null) { $group +="!" } $group +=")" $groups += $group foreach( $groupdn in $mo.MemberOf ) { $groups = Get-ADPrincipalGroupMembershipRecursive -dn $groupdn -level ($level+1) -groups $groups } if ($level -le 0) { $primarygroupdn = (Get-ADUser -Identity $dn -Properties PrimaryGroup).PrimaryGroup $groups = Get-ADPrincipalGroupMembershipRecursive -dn $primarygroupdn -level ($level+1) -groups $groups } return $groups } $adusergroups = Get-ADPrincipalGroupMembershipRecursive -dn $aduser.DistinguishedName $adusergroups | ft -AutoSize | ` Out-File -Width 512 Get-ADPrincipalGroupMembershipRecursive.txt #-Append #-Wrap # | Sort-Object -Property Name |
1 2 | Get-ADUser -Filter { memberOf -RecursiveMatch"CN=Administrators,CN=Builtin,DC=Fabrikam,DC=com" } -SearchBase"CN=Administrator,CN=Users,DC=Fabrikam,DC=com" -SearchScope Base ## NOTE: The above command will return the user object (Administrator in this case) if it finds a match recursively in memberOf attribute. |
Get-ADPrincipalGroupMembership USERLOGON |选择名字