90 lines
3.3 KiB
PowerShell
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." |