217

PowerShell's Get-ADGroupMember cmdlet returns members of a specific group. Is there a cmdlet or property to get all the groups that a particular user is a member of?

0

34 Answers 34

390

Get-ADPrincipalGroupMembership from the Active Directory module will do this. You'll need that module, or RSAT on Windows 10+, installed to run the command below.

Get-ADPrincipalGroupMembership username | select name name ---- Domain Users Domain Computers Workstation Admins Company Users Company Developers AutomatedProcessingTeam 
Sign up to request clarification or add additional context in comments.

9 Comments

I have tried this but found that it only returns the 'Domain Users' group for any user.
The above was giving me errors ("The server was unable to process the request due to an internal error" - presumably functionality not available on the server). get-aduser $username -Properties memberof | select -expand memberof worked fine though.
Note that the Get-ADPrincipalGroupMembership requires a "global catalog server" - without that it returns the error "Directory Object Not Found" even though the object is confirmed to exist via Get-ADUser cmdlet and it has membership. Response from @schmeckendeugler worked very well for me to get group membership.
Unfortunately, the Get-ADPrincipalGroupMembership cmdlet is broken in such a way that makes it fundamentally unreliable, so I don't recommend using it. The script I posted in linked answer works correctly, though.
I will agree to (rather strongly) disagree. In many AD environments, for example, the "/" character is required in AD object names. I stand by my "fundamentally unreliable" assessment as the built-in cmdlets should handle characters that are perfectly valid (albeit need escaping) in AD.
|
157

Single line, no modules necessary, uses current logged user:

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

Kudos to this vbs/powershell article: http://technet.microsoft.com/en-us/library/ff730963.aspx

4 Comments

Thank you, I appreciate this no-modules version. I simply changed the variable from $env:username to $username and set with $username = "testuser" to easily do variable substitution for other user lookups.
Does not work correctly for nested membership of user's DEFAULT GROUP. See here: stackoverflow.com/questions/53451706/…
To get (sorted) plain list of groups only, you can run (New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf -replace "CN=(.*?),.*" ,"``$1" | Sort.
This is great. I provided a function based on this solution with a recursive option in this community wiki. feel free to edit.
65

A more concise alternative to the one posted by Canoas, to get group membership for the currently-logged-on user.

I came across this method in this blog post: http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/

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

An even better version which uses a regex to strip the LDAP guff and leaves the group names only:

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

More details about using the [ADSISEARCHER] type accelerator can be found on the scripting guy blog: http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type-accelerator-to-search-active-directory.aspx

5 Comments

Both of these give me the error : Exception calling "FindOne" with "0" argument(s): "The samaccountname= search filter is invalid."
Strange.... I just tested it again, but on Windows 7 in a completely different environment, and it works fine here too.
I tried again just now, still on Win 7, and it does work fine. Perhaps I had typo when first trying this out. Thanks for adding the replace to strip out the forest "guff".
Works great, append | Sort-Object to make it even more readable.
Does not work correctly for nested membership of user's DEFAULT GROUP. See here: stackoverflow.com/questions/53451706/…
51

Old school way from CMD:

net user mst999 /domain 

2 Comments

it also works on client machines without extra AD tools
Unfortunately - if your groups names are long (ie > 21 characters) then it will truncate them...
32
(GET-ADUSER –Identity USERNAME –Properties MemberOf | Select-Object MemberOf).MemberOf 

5 Comments

| get-adgroup will output the group objects. Brilliant!
or, use $env:USERNAME instead to grab the username of the currently logged in user
Does not work with default group. See here: stackoverflow.com/questions/53451706/…
THIS is the right one folks. All these other answers either don't work at all, require other tools, truncate the output or are too complex.
Essentially results in the same: Get-AdUser username -Properties MemberOf | select -Expand MemberOf
32

This should provide you the details for current user. Powershell not needed.

whoami /groups

2 Comments

This is helpful only for the logged in user AD group membership. However if you need another user or are running from an elevated shell this is not helpful.
This is not what was asked though:, "How to get all groups that a user is a member of?"
13

If you cannot get Get-ADPrincipalGroupMembership to work for you could try logging in as that user then use.

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

4 Comments

You don't need to login as the user either if you use something like $id = [Security.Principal.WindowsIdentity]("username")
This shortens nicely to the one-liner [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | % {$_.Translate([Security.Principal.NTAccount])}.
THAT is a TERRIBLE answer, as that violates every company's security to NOT do that.
@PatrickBurwell I get your point. I was thinking more of cases where you cannot access something but one of your collegues can, or your helping somone via teamviewer or something... rather than someone doing it to lots of users without a users knowledge
10

While there are many excellent answers here, there is one which I was personally looking for that was missing. Once I figured it out - I thought I should post it in case I want to find it later, or it actually manages to help someone else at some point:

Get-ADPrincipalGroupMembership username | Format-Table -auto 

A second approach for presenting this is to specify the individual columns you are interested in eg:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory 

This gives all the AD groups the username belongs to - but also presents all of the default properties of each group formatted nicely as a table.

The key benefit this gives you is you can see at a glance which are distribution lists, & which are Security groups. You can further see at a glance which are Universal, which are DomainLocal & which are Global.
Why would you care about this last bit?

  • Universal group is a security or distribution group that contains users, groups, and computers from any domain in its forest as members. You can give universal security groups rights and permissions on resources in any domain in the forest.
  • Global group is a group that can be used in its own domain, in member servers and in workstations of the domain, and in trusting domains. In all those locations, you can give a global group rights and permissions and the global group can become a member of local groups. However, a global group can contain user accounts that are only from its own domain.
  • Domain local group is a security or distribution group that can contain universal groups, global groups, other domain local groups from its own domain, and accounts from any domain in the forest. You can give domain local security groups rights and permissions on resources that reside only in the same domain where the domain local group is located.

2 Comments

I agree. This is the better solution if you want to DO something with the output in PowerShell (which a sysadmin probably will). Also a lot easier to remember than the -I admit- very elegant oneliner-solution that was proposed and upvoted for 100+ times.
Excellent, nice table output, "This gives all the AD groups the username belongs to - but also presents all of the default properties of each group formatted nicely as a table."
5

I wrote a PowerShell function called Get-ADPrincipalGroupMembershipRecursive. It accepts the DSN of a user, computer, group, or service account. It retrieves an initial list of groups from the account's memberOf attribute, then recursively checks those group's memberships. Abbreviated code is below. Full source code with comments can be found here.

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 

2 Comments

Does not work correctly with user's DEFAULT GROUP. See here: stackoverflow.com/questions/53451706/…
Does this function get all nested grouping as well?
5

Get-Member is not for getting user's group membership. If you want to get a list of groups a user belongs to on the local system, you can do so by:

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

In the above query, replace DemoUser1 with the username you want and the DomainName with either your local computer name or domain name.

3 Comments

This query is very time consuming and responds very slow when there are multiple users and groups in the environment
Whoever is editing the answer make sure you edit it the right way. I was suggesting the OP to replace DemoUser1 with whatever username he wants. And, you completely changed that meaning.
This may be slow, but it gets the right response:
5

Get group membership for a user:

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

See Get Group Membership for a User

But also see Quest's Free PowerShell Commands for Active Directory.

[Edit: Get-ADPrincipalGroupMembership command is included in Powershell since v2 with Windows 2008 R2. See kstrauss' answer below.]

4 Comments

Actually there's an easier way with Quest cmdlets: Get-QADGroup -Contains Primoz
This is no longer the best answer as Get-ADPrincipalGroupMembership is now built into PowerShell
Voted down because It would be much better to use Get-ADPrincipalGroupMembership. I would like to undo this downvote, but I cannot. I will edit the answer to point out that the built in option now exists.
Now you make it easy to use: #Get-PromptedUser-AllGroupMemberships.ps1 $user = Read-host -prompt "Waht us do you need all group memberships for?" Get-ADPrincipalGroupMembership $user | Format-Table -auto
4

Get-Member is a cmdlet for listing the members of a .NET object. This has nothing to do with user/group membership. You can get the current user's group membership like so:

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

If you need access to arbitrary users' group info then @tiagoinu suggestion of using the Quest AD cmdlets is a better way to go.

Comments

4

No need for long scripts when it is a simple one liner..

QUEST Command

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

MS AD Command

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

I find the MS AD cmd is faster but some people like the Quest ones better..

Steve

Comments

4

Use:

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

This pipes output of the command into a CSV file.

Comments

4

For LOCAL users and groups (ie not in Active Directory), and if you don't want to, or aren't allowed to, or can't install RSAT and/or Install-WindowsFeature RSAT-AD-PowerShell and/or import-module activedirectory then here's a pure, pre-installed powershell (5.1+) way to do it.

(Note: Get-LocalGroup* used below are only available Powershell v5.1 and above. "...v5.1 was released along with the Windows 10 Anniversary Update on August 2, 2016, and in Windows Server 2016. ...[F]or Windows 7, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, and Windows Server 2012 R2 [it] was released on January 19, 2017." (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 } } 

Example output:

Administrators Users 

3 Comments

This method is unrelated to Active Directory.
@Slogmeister Extraordinaire My reasoning is that some Internet users searching for this question will be interested in local groups not in active directory
@johnvkrumpf Understood, but your answer does not indicate that it is not an Active Directory solution. It suggests that if you can't load the AD module/tools that this will work, but it will not in this context. The question specifically requests an AD solution. I'm not against your reasoning, however as I have done the same plenty of times. However, consider that the reader may not understand that your answer doesn't work with AD and be very frustrated trying. Modify your answer to clearly indicate this is a non-AD solution and I'll upvote it.
4

First, import the ActiveDirectory module:

Import-Module ActiveDirectory 

Then issue this command:

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

This will display the members of the specified group.

1 Comment

The OP asks for the opposite. Get all groups a specified user is member of.
3

It is just one line:

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

end of :)

1 Comment

Piping that to a select -expandproperty memberof will make the output a little more readable/useful.
3
(Get-ADUser $env:username -Properties MemberOf).MemberOf | % {$_.split(",")[0].replace("CN=","")} Domain Users Domain Computers Workstation Admins Company Users Company Developers AutomatedProcessingTeam 

1 Comment

Hi, this question already has an answer, if you have a different solution, that is better in some way, try to explain how it or when it is better than the approved one
2

The below works well:

get-aduser $username -Properties memberof | select -expand memberof 

If you have a list of users:

$list = 'administrator','testuser1','testuser2' $list | ` %{ $user = $_; get-aduser $user -Properties memberof | ` select -expand memberof | ` %{new-object PSObject -property @{User=$user;Group=$_;}} ` } 

1 Comment

#Get-PromptedUser-AllGroupMemberships.ps1 $user = Read-host -prompt "What us do you need all group memberships for?" Get-ADPrincipalGroupMembership $user | Format-Table -auto
2

Studying all comments presented gave me a starting point (thanks for such) but left me with several unresolved issues. As result here is my answer. The code snippet provided does a little more than what is asked for but it provides helpful debugging info.

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

Sorry I forgot to clarify. Do this first: $aduserDistinguishedName = "CN=name,OU=..." $aduser = Get-ADUser -Identity $aduserDistinguishedName -Properties *
2

There is no need for PowerShell, you could use the command line tool gpresult as follows:

gpresult /USER domain\username /R 

You may omit the /USER portion to display the information for the currently logged on user:

gpresult /R 

Example output:

Microsoft (R) Windows (R) Operating System Group Policy Result tool v2.0 © Microsoft Corporation. All rights reserved. Created on ‎10/‎01/‎2024 at 10:14:48 RSOP data for DOMAIN\username on SYSTEM : Logging Mode ------------------------------------------------------- OS Configuration: Member Workstation OS Version: 10.0.19045 Site Name: N/A Roaming Profile: N/A Local Profile: C:\Users\username Connected over a slow link?: No USER SETTINGS -------------- CN=full name,OU=organisation unit,DC=some Last time Group Policy was applied: 10/01/2024 at 09:00:00 Group Policy was applied from: server Group Policy slow link threshold: 500 kbps Domain Name: MEDEL Domain Type: Windows 2008 or later Applied Group Policy Objects ----------------------------- usrPolWindowsAccounts (list of applied group policies) The following GPOs were not applied because they were filtered out ------------------------------------------------------------------- usrPolGermanGermany Filtering: Denied (Security) (list of denied group policies) The user is a part of the following security groups --------------------------------------------------- Domain Users Everyone Remote Desktop Users BUILTIN\Users NT AUTHORITY\INTERACTIVE CONSOLE LOGON NT AUTHORITY\Authenticated Users This Organization LOCAL secUsersEnglish (list of security groups) 

In contrast to the net user command (as suggested in user4511672's answer), the group names are not truncated.

Comments

1

Get-QADUser -SamAccountName LoginID | % {$_.MemberOf } | Get-QADGroup | select name

Comments

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

Comments

1

I couldn't get the following to work for a particular user:

Get-ADPrincipalGroupMembership username 

It threw an error that I was not willing to troubleshoot.

I did however come up with a different solution using Get-ADUser. I like it a bit better because if you don't know the account name then you can get it based off of a wildcard on the user's actual name. Just fill in PartOfUsersName and away it goes.

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

Huge props to schmeckendeugler and 8DH for getting me to this solution. +1 to both of you.

Comments

1

To get it recursive, you can use:

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

Comments

1

Putting this here for future reference. I'm in the midst of an email migration. I need to know each user account and its respective group membership, and also I need to know each group and its respective members.

I'm using the code block below to output a CSV for each user's group membership.

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 ; ` } 

The export process for the groups and their respective members was a little convoluted, but the below works. The output filenames include the type of group. Therefore, the email distribution groups I need are/should be the Universal and Global Distribution groups. I should be able to just delete or move the resulting TXT files I don't need.

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=""; ` } 

Comments

1

When you do not have privileges to consult other member groups but you do have the privilege to consult group members, you can do the following to build a map of which user has access to which groups.

$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) } } 

Comments

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

Change the value of -SearchBase to reflect the OU you need to list the users from :)

This will list all of the users in that OU and show you which groups they are a member of.

Comments

0

Get-ADPrincipalGroupMembership USERLOGON | select name

Comments

0

This is the simplest way to just get the names:

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

Add a select statement to trim the response or to get every user in an OU every group they are a user of:

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.