Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [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 }
Advertisement
Add Comment
Please, Sign In to add comment