HPV
HPV

Reputation: 9

Exporting Membership groups for users from input file

I have this script that reads samaccountnames from a file and outputs the name of the user with its membership information. However, the output file only shows the last record. It seems that my code is overwriting the previous record. What am I missing? Thank you so much.

ForEach ($user in $(Get-Content -Path C:\MyScripts\UsersInput.csv)) 
{
    $username = Get-ADUser –Identity $user -Properties * 
    Get-ADPrincipalGroupMembership $user | select $username.DisplayName, name | 
    export-csv "C:\MyScripts\UsersAndTheirADGroups.csv" -NoTypeInformation  
}

Upvotes: 0

Views: 297

Answers (3)

Theo
Theo

Reputation: 61263

You are reading a CSV file using Get-Content. This lets me think the file is simply a list of user SamAccountNames, each on a separate line. No headings.
Something like this perhaps:

jdoe
jsmith

If that is the case, read the input file like this:

$users = Get-Content -Path 'C:\MyScripts\UsersInput.csv'

To get an array of user SAMAccountnames.

If however it is a proper CSV file with headers, looking something like this:

"SamAccountName","Email","More","Stuff"
"jdoe","[email protected]","blah","blah"
"jsmith","[email protected]","blah","blah"

Then you should use the Import-Csv cmdlet to get the entries as objects and obtain an array of SamAccountNames from that:

$users = Import-Csv -Path 'C:\MyScripts\UsersInput.csv' | Select-Object -ExpandProperty SamAccountName

Once you have that array, loop through it and get the group membership info for each user

Untested

$result = foreach ($accountName in $users) {
    Get-ADUser –Identity $accountName -Properties DistinguishedName, DisplayName |
        Select-Object @{Name = 'User'; Expression = {$_.DisplayName}},  
                      @{Name = 'Groups'; Expression = { ( $_ | Get-ADPrincipalGroupMembership | Select-Object -ExpandProperty name) -join ', '}}
}
$result | Export-Csv "C:\MyScripts\UsersAndTheirADGroups.csv" -NoTypeInformation  

Upvotes: 1

T-Me
T-Me

Reputation: 1894

You are indeed overwriting the code ForEach user. You included Export-Csv in the ForEach. Instead export the whole array that ForEach creates:

ForEach ($user in $(Get-Content -Path C:\MyScripts\UsersInput.csv)) 
{
    $username = Get-ADUser –Identity $user -Properties * 
    Get-ADPrincipalGroupMembership $user | select $username.DisplayName, name
} | export-csv "C:\MyScripts\UsersAndTheirADGroups.csv" -NoTypeInformation  

Upvotes: 0

Matt Browne
Matt Browne

Reputation: 21

Export-Csv has an -append parameter, so you could use that. ie it would append to the csv file with every iteration of the loop. You would need to make sure the file didn't exist before you start the loop or it would just get bigger and bigger each time you ran the code.

Another way it to add the items to an object and then export that at the end. ie $username += Get-ADUser......

Upvotes: 1

Related Questions