lakerskill
lakerskill

Reputation: 1079

Format an array inside powershell object

So I have a script that grabs each user and all groups the user belongs in. When I export to a CSV, it has the user in one column, and in the next, all the groups the user is in. Is there anyway to make it where the groups can have their own line each, as opposed to all groups in one cell? This is how the output looks

[user][usergroup a, usergroupb, etc]

and I want

[user][usergroupa]

[ ][usergroupb]

This is my code if anyone wants it:

$users = get-azureaduser -Top 400 | Where-Object{$_.jobtitle -ne $null} |Where-Object{$_.department -eq "Information Technology"} | select userprincipalname
$groups = ForEach($user in $users){
$usergroups = get-azureadusermembership -ObjectId $user.UserPrincipalName | select displayname 

New-Object -TypeName PSObject -Property @{
            User=$user.UserPrincipalName
            Groups = [string]$usergroups.displayname
}
}
$groups | Export-Csv -Path 'C:\TEXTDUMP\usergroups.csv'

Upvotes: 1

Views: 63

Answers (2)

Santiago Squarzon
Santiago Squarzon

Reputation: 59782

I believe you're looking to expand the data per group, each group per line. If so, you need to loop over the result from Get-AzureADUserMembership:

Get-AzureADUser -Filter "department eq 'Information Technology'" -Top 400 | ForEach-Object {
    if($_.jobTitle) {
        foreach($group in Get-AzureADUserMembership -ObjectId $_.UserPrincipalName) {
            [pscustomobject]@{
                User   = $_.UserPrincipalName
                Groups = $group.DisplayName
            }
        }
    }
} | Export-Csv -Path 'C:\TEXTDUMP\usergroups.csv'

Haven't used the AzureAD Module in a while but I believe the filter:

-Filter "department eq 'Information Technology'"

Should work and be a good replacement for:

Where-Object { $_.department -eq "Information Technology" }

Upvotes: 1

Mathias R. Jessen
Mathias R. Jessen

Reputation: 174435

You just need an extra foreach loop over the group memberhips:

$users = Get-AzureADuser -Top 400 | Where-Object { $_.jobtitle -ne $null } | Where-Object { $_.department -eq "Information Technology" } | Select-Object -ExpandProperty userprincipalname
$groupMemberships = ForEach ($user in $users) {
    $userGroups = Get-AzureADUserMembership -ObjectId $user | Select-Object -ExpandProperty displayName

    foreach($group in $userGroups){
        New-Object -TypeName PSObject -Property @{
            User   = $user
            Group  = $group
        }
    }
}

$groupMemberships | Export-Csv -Path 'C:\TEXTDUMP\usergroups.csv'

This will produce 1 CSV row per membership, rather than per user

Upvotes: 1

Related Questions