Issue filtering out bad data

Welcome Forums General PowerShell Q&A Issue filtering out bad data

This topic contains 1 reply, has 1 voice, and was last updated by

 
Participant
3 months, 2 weeks ago.

  • Author
    Posts
  • #105766

    Participant
    Points: 0
    Rank: Member

    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.

  • #105823

    Participant
    Points: 0
    Rank: Member

    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
        }
    

The topic ‘Issue filtering out bad data’ is closed to new replies.