[CmdletBinding()] param( [Parameter(Mandatory=$true)][string]$RemoteDC, [Parameter(Mandatory=$true)][string]$RemoteOU, [Parameter(Mandatory=$true)][string]$LocalOU, [Parameter(Mandatory=$false)][System.Management.Automation.PSCredential]$RemoteCred, [Parameter(Mandatory=$false)][string]$AddressList, [Parameter(Mandatory=$false)][int]$MaxDeletions = 64, [Parameter(Mandatory=$false)][switch]$ScheduledTask = $false, [Parameter(Mandatory=$false)][string]$TargetDomain ) If($ScheduledTask) { Start-Transcript -Path .\Sync-GAL-$AddressList.log -Append } Import-Module ActiveDirectory #Get active remote users Try { if($null -ne $RemoteCred) { $RUsers = Get-ADUser -Server $RemoteDC -Credential $RemoteCred -LDAPFilter "(&(objectClass=user)(mail=*)(userAccountControl:1.2.840.113556.1.4.803:=512)(!userAccountControl:1.2.840.113556.1.4.803:=2))" ` -SearchBase $RemoteOU -Properties company, department, displayName, givenName, mail, physicalDeliveryOfficeName, sn, telephoneNumber, title, pager, ipPhone, legacyExchangeDN $RGroups = Get-ADGroup -Server $RemoteDC -Credential $RemoteCred -LDAPFilter "(mail=*)" -Properties displayname, mail, department, company, telephoneNumber, legacyExchangeDN } else { $RUsers = Get-ADUser -Server $RemoteDC -LDAPFilter "(&(objectClass=user)(mail=*)(userAccountControl:1.2.840.113556.1.4.803:=512)(!userAccountControl:1.2.840.113556.1.4.803:=2))" ` -SearchBase $RemoteOU -Properties company, department, displayName, givenName, mail, physicalDeliveryOfficeName, sn, telephoneNumber, title, pager, ipPhone, legacyExchangeDN $RGroups = Get-ADGroup -Server $RemoteDC -LDAPFilter "(mail=*)" -Properties displayname, mail, department, company, telephoneNumber, legacyExchangeDN } } Catch { Write-Output "Cant's connect to Remote DC!" break } #Generate list of remote users with local OU $RCheck = $RUsers | select @{e={"CN=$($_.Name),$LocalOU"};Label="DistinguishedName"} $RCheck += $RGroups | select @{e={"CN=$($_.Name),$LocalOU"};Label="DistinguishedName"} #Get local contacts $LUsers = Get-ADObject -LDAPFilter "(mail=*)" -SearchBase $LocalOU -prop mail #Remove local contacts that no longer exist in remote OU $Remove = $LUsers | ?{$RCheck.DistinguishedName -notcontains $_.DistinguishedName} If($Remove.Count -gt $MaxDeletions) { Write-Output "Too many deletions $($Remove.Count), something may be wrong!" break } $LUsers | ?{$RCheck.DistinguishedName -notcontains $_.DistinguishedName} | %{ Remove-MailContact $_.DistinguishedName -confirm:$false } #Create/update local contacts with values from remote users ForEach ($RUser in $RUsers) { If(!$ScheduledTask) { Write-Host $RUser.DistinguishedName } $ContactDN = "CN={0},{1}" -f $RUser.Name, $LocalOU $contact = Get-MailContact -Identity $ContactDN -ErrorAction SilentlyContinue $recip = Get-Recipient $ruser.mail -ErrorAction SilentlyContinue $targetAddress = $ruser.mail if($TargetDomain -ne $null) { $targetAddress = "$($ruser.samAccountName)@$TargetDomain" } If($null -eq $contact -and $null -eq $recip) { Write-Host "Creating contact $($RUser.DistinguishedName)" -ForegroundColor Cyan $contact = New-MailContact -OrganizationalUnit $LocalOU -FirstName $RUser.givenName -LastName $RUser.sn -Name $RUser.Name -DisplayName $RUser.Name -ExternalEmailAddress $targetAddress -PrimarySmtpAddress $RUser.mail #Start-Sleep 10 } If($null -ne $contact) { $recip = Get-Recipient $ruser.mail -ErrorAction SilentlyContinue If($null -eq $recip) { Set-ADObject -identity $contact.DistinguishedName -add @{'proxyAddresses'="smtp:$($ruser.mail)"} #Start-Sleep 10 $recip = Get-Recipient $ruser.mail -ErrorAction SilentlyContinue } if($null -ne $recip) { if($recip.RecipientType -eq "MailContact") { $adobjfound = $false Try { $ado = Get-ADObject -Identity $contact.DistinguishedName -ErrorAction SilentlyContinue $adobjfound = $true } Catch { #Can't get AD Object yet, try again later. } if ($adobjfound) { $DisplayName = $RUser.displayName if($null -eq $DisplayName) { $DisplayName = $RUser.Name} $X500 = $RUser.legacyExchangeDN.Replace("'", "") Set-MailContact $contact.DistinguishedName -EmailAddressPolicyEnabled:$false -DisplayName $DisplayName -WarningAction SilentlyContinue Set-Contact $contact.DistinguishedName -Company $RUser.company -Department $RUser.department -FirstName $RUser.givenName -LastName $RUser.sn -Office $RUser.physicalDeliveryOfficeName -Phone $RUser.telephoneNumber -Title $RUser.title -Pager $RUser.pager -WarningAction SilentlyContinue if($null -ne $ado) { if($null -ne $RUser.legacyExchangeDN) { Set-ADObject $ado -add @{'proxyAddresses'="x500:$X500"} } if($null -ne $RUser.ipPhone -and $contact.ipPhone -ne $RUser.ipPhone) { Set-ADObject $ado -clear ipPhone -ErrorAction SilentlyContinue Set-ADObject $ado -add @{'ipPhone'=$RUser.ipPhone} } } } } } } } ForEach($RGroup in $RGroups) { If(!$ScheduledTask) { Write-Host $RGroup.DistinguishedName } $ContactDN = "CN={0},{1}" -f $RGroup.Name, $LocalOU $contact = Get-MailContact -Identity $ContactDN -ErrorAction SilentlyContinue $recip = Get-Recipient $RGroup.mail -ErrorAction SilentlyContinue $targetAddress = $RGroup.mail $samAccountName = $RGroup.samAccountName.Replace(" ", "") if($TargetDomain -ne $null) { $targetAddress = "$samAccountName@$TargetDomain" } If($null -eq $contact -and $null -eq $recip) { Write-Host "Creating contact $($RGroup.DistinguishedName)" -ForegroundColor Cyan $contact = New-MailContact -OrganizationalUnit $LocalOU -FirstName $RGroup.Name -Name $RGroup.Name -DisplayName $RGroup.Name -ExternalEmailAddress $targetAddress -PrimarySmtpAddress $RGroup.mail #Start-Sleep 10 } If($null -ne $contact) { $recip = Get-Recipient $RGroup.mail -ErrorAction SilentlyContinue If($null -eq $recip) { Set-ADObject -identity $contact.DistinguishedName -add @{'proxyAddresses'="smtp:$($RGroup.mail)"} #Start-Sleep 10 $recip = Get-Recipient $RGroup.mail -ErrorAction SilentlyContinue } if($null -ne $recip) { if($recip.RecipientType -eq "MailContact") { $adobjfound = $false Try { $ado = Get-ADObject -Identity $contact.DistinguishedName -ErrorAction SilentlyContinue $adobjfound = $true } Catch { #Can't get AD Object yet, try again later. } if ($adobjfound) { $DisplayName = $RGroup.displayName $X500 = $RGroup.legacyExchangeDN.Replace("'", "") if($null -eq $DisplayName) { $DisplayName = $RGroup.Name} Set-MailContact $contact.DistinguishedName -EmailAddressPolicyEnabled:$false -DisplayName $DisplayName -WarningAction SilentlyContinue Set-Contact $contact.DistinguishedName -Company $RGroup.company -Department $RGroup.department -FirstName $RGroup.DisplayName -Phone $RGroup.telephoneNumber -WarningAction SilentlyContinue if($null -ne $ado) { if($null -ne $RGroup.legacyExchangeDN) { Set-ADObject $ado -add @{'proxyAddresses'="x500:$X500"} } } } } } } } #Update address list (if supplied) if($AddressList -ne "") { Get-AddressList -Identity $AddressList | Update-AddressList } If($ScheduledTask) { Stop-Transcript }