Author Posts

August 1, 2018 at 8:58 pm

Greetings All,

I have been tasked with the creation of 5000+ Office 365 groups. The settings for which will come from JSON files generated by a Unix mailsystem. The current issue is with populating the membership. In the JSON files where the members are listed, some of the members do not exist, so in testing, when I attempt to populate the membership with the add-unifiedgrouplinks cmdlet, if even one object is bad, it skips that group. Ideally, I'm looking to loop through the members list before running add-unifiedgrouplinks and filter out any that do not exist and then feed that updated list into the function that creates the group, but I am clearly just not grasping the logic of how to accomplish this task. I am hoping someone might be able to guide me in the right direction. Here is what I have so far (admittedly, some of my choices for the test function are probably way off base):

# First, here is a sample of JSON data:

{
    "AccessType": "Private",
    "AutosubscribeNewMembers": true,
    "DisplayName": "testgroup1",
    "PrimarySMTPAddress": "testgroup1@nowhere.local",    
    "HiddenFromAddressListsEnabled": true,
    "HiddenGroupMembershipEnabled": true,
    "ManagedBy": "listowner",
    "Members": [
        "testuser1",
        “listmaster”,
        "realaddress@grealdomain.local",
        "bogusaddress"
    ]
}

In the above list of members, all but bogusaddress exist.

# VARIABLES:
# Variable that cycles through each .json file and converts it to a Powershell object
$jsonFiles = Get-ChildItem -path "c:\tmp\json" -filter *.json | get-content -raw

$allobjects = $jsonFiles | convertfrom-json

$testMembers = ForEach-Object{$allobjects.members}{select $_}

# Set path for log files:
$logPath = "c:\tmp\logs"


# FUNCTIONS:
function add-GroupMembers {
    [CmdletBinding()]
    Param(
        [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
        $InputObject
    )

    Process {
                try
                {
                    write-host "Adding Group Members:  gr-$($InputObject.DisplayName)"

                    if($InputObject.managedby -notin $InputObject.members){
                            Write-Host "Adding $($InputObject.managedby) to gr-$($InputObject.DisplayName) before setting as an owner"

                            Add-UnifiedGroupLinks -Identity "gr-$($InputObject.DisplayName)" `
                            -LinkType members `
                            -Links $InputObject.managedby

                            Add-UnifiedGroupLinks -Identity "gr-$($InputObject.DisplayName)" `
                            -LinkType members  `
                            -Links $InputObject.members

                            # USED TO VALIDATE ABOVE WORKED        
                            $groupMembers = Get-UnifiedGroupLinks -Identity "gr-$($InputObject.DisplayName)" -LinkType members | `
                            select name -ExpandProperty name
        
                            write-output "$($timeFull):`r`nGroup:  gr-$($InputObject.Displayname)`r`nMembers: $($groupMembers)`r`n" | ` 
                            out-file -Append "$($logPath)\$($timeShort)_add-GroupMembers.log"
                        }
                    else{
                             Add-UnifiedGroupLinks -Identity "gr-$($InputObject.DisplayName)" `
                             -LinkType members  `
                             -Links $InputObject.members
   
                             # USED TO VALIDATE ABOVE WORKED
                             $groupMembers = Get-UnifiedGroupLinks -Identity "gr-$($InputObject.DisplayName)" -LinkType members | `
                             select name -ExpandProperty name
        
                             write-output "$($timeFull):`r`nGroup:  gr-$($InputObject.Displayname)`r`nMembers: $($groupMembers)`r`n" | ` 
                             out-file -Append "$($logPath)\$($timeShort)_add-GroupMembers.log"
                     }        
            }
            catch
            {
                 $ErrorMessage = $_.Exception.Message
                    
                 $FailedItem = $_.Exception.ItemName
                    
                 write-output "$($timeFull): Error trying to add members to group:  gr-$($InputObject.DisplayName);`r`nError Message:  $($ErrorMessage)" `r`n | `
                 out-file -append -filepath "$($logPath)\$($timeShort)_add-GroupMembers_error.log"
            }
        }
   }

With legitimate data, this function works when I run:
$allobjects | add-GroupMembers

I've tried adding an additional function with an additional variable ($testMembers) just to test logic:

function test-GroupMembers {
    [CmdletBinding()]
    Param(
        [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
        $InputObject,

        [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
        $badMember
    )

    Process {
                    write-host "Testing Group Members:  gr-$($InputObject.DisplayName)"

                    Get-AzureADUser -filter "DisplayName eq '$($badMember)'"
                    
                    if(-not $null){

                            # TESTING ONLY               
                                write-host $badMember
                            
                            }
                            else{

                                #TESTING ONLY
                              write-host “Command failed”

                                    }
                    }
            }

$allobjects | test-GroupMembers -badMember $testmembers

I must admit I am a bit lost at this point. The add-GroupMembers function works ok provided there are no bad entries in the Members section. Also, I am using get-azureaduser because the member can be eiter an internal user or external recipient.

Thank you in advance for any assistance that can be provided.

August 2, 2018 at 6:31 pm

Quick update: As it turns out, it turned out to be a simple foreach loop in the add-groupmembers function. The additional function and variable were not needed. I was grossly overthinking this one.

Instead of:

Add-UnifiedGroupLinks -Identity "gr-$($InputObject.DisplayName)" `
-LinkType members  `
-Links $InputObject.members

I simply added the following:

foreach ($member in $InputObject.members) {
Add-CloudUnifiedGroupLinks -Identity "gr-$($InputObject.DisplayName)" `
    -LinkType members  `
    -Links $member
    }