10

I need to return all members of multiple security groups using PowerShell. Handily, all of the groups start with the same letters.

I can return a list of all the relevant security groups using the following code:

Get-ADGroup -filter 'Name -like"ABC*"' | Select-Object Name

And I know I can return the membership list of a specific security group using the following code:

Get-ADGroupMember "Security Group Name" -recursive | Select-Object Name

However, I can't seem to put them together, although I think what I'm after should look something like this (please feel free to correct me, that's why I'm here!):

$Groups = Get-ADGroup -filter 'Name -like"ABC*"' | Select-Object Name
ForEach ($Group in $Groups) {Get-ADGroupMember -$Group -recursive | Select-Object Name

Any ideas on how to properly structure that would be appreciated!

Thanks,

Chris

4 Answers 4

14

This is cleaner and will put in a csv.

Import-Module ActiveDirectory

$Groups = (Get-AdGroup -filter * | Where {$_.name -like "**"} | select name -expandproperty name)


$Table = @()

$Record = [ordered]@{
"Group Name" = ""
"Name" = ""
"Username" = ""
}



Foreach ($Group in $Groups)
{

$Arrayofmembers = Get-ADGroupMember -identity $Group | select name,samaccountname

foreach ($Member in $Arrayofmembers)
{
$Record."Group Name" = $Group
$Record."Name" = $Member.name
$Record."UserName" = $Member.samaccountname
$objRecord = New-Object PSObject -property $Record
$Table += $objrecord

}

}

$Table | export-csv "C:\temp\SecurityGroups.csv" -NoTypeInformation
Sign up to request clarification or add additional context in comments.

2 Comments

Fantastic! This also allows you to get the groupname into your CSV by using new PS objects. Nice.
This worked for me after I removed [ordered] for PS2.0 (check your version with $PSVersionTable.PSVersion), added -Encoding UTF8 to the Export-CSV to handle non-ascii characters in names, and added -recursive to Get-ADGroupMember to list members of the nested groups (alternately you might want to add the objectClass attribute to the output to distinguish member groups from member users).
4

If you don't care what groups the users were in, and just want a big ol' list of users - this does the job:

$Groups = Get-ADGroup -Filter {Name -like "AB*"}

$rtn = @(); ForEach ($Group in $Groups) {
    $rtn += (Get-ADGroupMember -Identity "$($Group.Name)" -Recursive)
}

Then the results:

$rtn | ft -autosize

3 Comments

Thanks, I made one small change just to return the name only, which made the script into the following: $Groups = Get-ADGroup -Filter {Name -like "TIG*"} $rtn = @() ForEach ($Group in $Groups) { $rtn += (Get-ADGroupMember -Identity "$($Group.Name)" -Recursive | select-object name) } $rtn | ft' This did return duplicates (since some people are in multiple groups), however for me this was fine as I just copied the results into Excel and removed duplicates. Thanks very much, Chris
Glad I could help.. As a side note, adding: $rtn | select Name -unique | ft -autosize when returning results would have eradicated the duplicates.
This is a little easier with the same results: get-ADGroup -filter {Name -like "AB*"} | get-ADGroupMember | ft -AutoSize Good luck! :)
4
Get-ADGroupMember "Group1" -recursive | Select-Object Name | Export-Csv c:\path\Groups.csv

I got this to work for me... I would assume that you could put "Group1, Group2, etc." or try a wildcard. I did pre-load AD into PowerShell before hand:

Get-Module -ListAvailable | Import-Module

3 Comments

The above link is titled "How to add Active Directory module in PowerShell in Windows 7"
You can not 'put "Group1, Group2, etc.': "Cannot find an object with identity: 'Group1, Group2'"
4

This will give you a list of a single group, and the members of each group.

param
(   
    [Parameter(Mandatory=$true,position=0)]
    [String]$GroupName
)

import-module activedirectory

# optional, add a wild card..
# $groups = $groups + "*"

$Groups = Get-ADGroup -filter {Name -like $GroupName} | Select-Object Name

ForEach ($Group in $Groups)
   {write-host " "
    write-host "$($group.name)"
    write-host "----------------------------"

    Get-ADGroupMember -identity $($groupname) -recursive | Select-Object samaccountname

 }
write-host "Export Complete"

If you want the friendly name, or other details, add them to the end of the select-object query.

1 Comment

Hi user2883951, it works like a charm, however it doesn't display the Group name before it list the username each ?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.