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

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


我解决了我的错误: Get-Member应该是Get-ADGroupMember

Get-ADPrincipalGroupMembership将执行此操作。

 Get-ADPrincipalGroupMembership username | select name name ---- Domain Users Domain Computers Workstation Admins Company Users Company Developers AutomatedProcessingTeam 

单行,不需要模块,使用当前logging的用户:

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

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

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

一个更简洁的替代Canoas发布的,以获得当前login用户的组成员资格。

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

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

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

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

有关使用[ADSISEARCHER]types加速器的更多详细信息,请参见脚本编写人员博客: http : //blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type -accelerator到search主动directory.aspx

CMD的老派方式:

 net user mst999 /domain 

获取用户的组成员资格:

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

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

但是,请参阅Quest的Active Directory免费PowerShell命令 。

[ 编辑Get-ADPrincipalGroupMembership命令包含在Windows 2008 R2以来的v2以来的PowerShell中。 请参阅下面的kstrauss的答案。]

Get-Member是用于列出.NET object成员的cmdlet。 这与用户/组成员身份无关。 您可以像这样获取当前用户的组成员资格:

 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的build议是更好的方法。

当它是一个简单的一个class轮时,不需要长的脚本。

QUEST命令

 (Get-QADUser -Identity john -IncludedProperties MemberOf | Select-Object MemberOf).MemberOf 

MS AD命令

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

我发现MS AD CMD更快,但有些人更喜欢Quest的。

史蒂夫

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

 $query = "ASSOCIATORS OF {Win32_Account.Name='DemoUser1',Domain='DomainName'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account" Get-WMIObject -Query $query | Select Name 

在上面的查询中,将DemoUser1replace为您需要的用户名和DomainName与您的本地计算机名称或域名称。

这只是一条线:

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

结束 :)

使用:

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

这将命令的输出转换为CSV文件。

首先,导入活动目录模块:

 import-module activedirectory 

然后发出这个命令:

 Get-ADGroupMember -Identity $group | foreach-object { Write-Host $_.SamAccountName } 

这将显示指定组的成员。

下面的工作很好:

 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-ADPrincipalGroupMembershipRecursive的PowerShell函数。 它接受用户,计算机,组或服务帐户的DSN。 它从账户的memberOf属性中检索组的初始列表,然后recursion地检查这些组的成员资格。 缩写代码如下。 完整的源代码与评论可以在这里find 。

 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 

Get-QADUser -SamAccountName LoginID | %{$ _。MemberOf} | Get-QADGroup | select姓名

 Import-Module ActiveDirectory Get-ADUser -SearchBase "OU=Users,DC=domain,DC=local" -Filter * | foreach-object { write-host "User:" $_.Name -foreground green Get-ADPrincipalGroupMembership $_.SamAccountName | foreach-object { write-host "Member Of:" $_.name } } 

更改-SearchBase的值以反映您需要列出用户的OU

这将列出该OU中的所有用户并显示他们是哪个组的成员。

Get-ADPrincipalGroupMembership USERLOGON | select姓名

  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 "YourUserName"

# Returns 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语句来修改响应,或者让每个用户都属于他们的用户:

foreach ($user in (get-aduser -SearchScope Subtree -SearchBase $oupath -filter * -Properties samaccountName, MemberOf | select samaccountName)){ Get-ADPrincipalGroupMembership $user.samaccountName | select name}

我无法得到以下为特定用户工作:

 Get-ADPrincipalGroupMembership username 

它抛出一个错误,我不愿意排除故障。

然而,我用Get-ADUser想出了一个不同的解决scheme。 我更喜欢它,因为如果您不知道帐户名称,那么您可以基于用户实际名称的通配符来获取它。 只需填写PartOfUsersName然后就可以了。

 #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让我到这个解决scheme。 +1给你们两个。

为了recursion,你可以使用:

 <# .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 

以上几乎所有的解决scheme都使用了ActiveDirecotry模块,在大多数情况下默认情况下可能不可用。

我用下面的方法。 有点间接,但满足了我的目的。

列出所有可用的组

Get-WmiObject -Class Win32_Group

然后列出用户所属的组

[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups

比较可以通过检查SIDs来完成。 这适用于login的用户。 如果我错了,请纠正我。 PowerShell完全是新的,但必须完成这项工作的承诺。

用户input和花哨的输出格式:

 [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 } }