# Define log directory and file $logDir = "C:\Logs" $logFile = "$logDir\Copy365GroupMemberships.log" # Create the log directory if it doesn't exist if (-not (Test-Path -Path $logDir)) { New-Item -ItemType Directory -Path $logDir | Out-Null Write-Host "Created log directory: $logDir" } # Function to write logs function Write-Log { param ( [string]$Message ) $timestamp = Get-Date -Format "dd-MM-yyyy HH:mm:ss" $logMessage = "$timestamp - $Message" Add-Content -Path $logFile -Value $logMessage Write-Host $logMessage } # Start logging Write-Log "INFO: Starting group membership copy process..." # Input the user's email address you want to copy from $source = "user1@domain.com.au" # Input the user's email address you want to paste the groups to $destination = "user2@domain.com.au" # Connect to Exchange Online try { Connect-ExchangeOnline -ErrorAction Stop Write-Log "INFO: Successfully connected to Exchange Online." } catch { Write-Log "ERROR: Failed to connect to Exchange Online. Error: $_" exit } # Get the DistinguishedName of the source user try { $dn = (Get-EXOMailbox $source -ErrorAction Stop).DistinguishedName Write-Log "INFO: Retrieved DistinguishedName for source user: $source" } catch { Write-Log "ERROR: Failed to retrieve DistinguishedName for source user: $source. Error: $_" exit } # Copy group memberships for GroupMailbox try { $groupMailboxes = Get-EXORecipient -Filter "Members -eq '$dn'" -RecipientTypeDetails GroupMailbox -ErrorAction Stop Write-Log "INFO: Found $($groupMailboxes.Count) GroupMailbox memberships for source user: $source" foreach ($group in $groupMailboxes) { try { Add-UnifiedGroupLinks -Identity $group.Name -LinkType Member -Links $destination -ErrorAction Stop Write-Log "INFO: Successfully added $destination to GroupMailbox: $($group.Name)" } catch { Write-Log "ERROR: Failed to add $destination to GroupMailbox: $($group.Name). Error: $_" } } } catch { Write-Log "ERROR: Failed to retrieve GroupMailbox memberships for source user: $source. Error: $_" } # Copy group memberships for MailUniversalDistributionGroup try { $distributionGroups = Get-EXORecipient -Filter "Members -eq '$dn'" -RecipientTypeDetails MailUniversalDistributionGroup -ErrorAction Stop Write-Log "INFO: Found $($distributionGroups.Count) Distribution Group memberships for source user: $source" foreach ($group in $distributionGroups) { try { Add-DistributionGroupMember -Identity $group.Name -Member $destination -ErrorAction Stop Write-Log "INFO: Successfully added $destination to Distribution Group: $($group.Name)" } catch { Write-Log "ERROR: Failed to add $destination to Distribution Group: $($group.Name). Error: $_" } } } catch { Write-Log "ERROR: Failed to retrieve Distribution Group memberships for source user: $source. Error: $_" } # Disconnect from Exchange Online try { Disconnect-ExchangeOnline -Confirm:$false -ErrorAction Stop Write-Log "INFO: Successfully disconnected from Exchange Online." } catch { Write-Log "ERROR: Failed to disconnect from Exchange Online. Error: $_" } # End logging Write-Log "INFO: Group membership copy process completed."