Powershell/Cloud/Microsoft365/IAM/Copy-User365GroupsV2.ps1

90 lines
3.3 KiB
PowerShell

# 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."