<# .SYNOPSIS Join-MailContactAndUser will join an existing contact to an existing user that matches on windows or external email address .DESCRIPTION Join-MailContactAndUser will join an existing contact to an existing user that matched on windows or external email address .PARAMETER Identity The Identity parameter identifies the contact. This parameter accepts the following values: * Example: JPhillips * Example: Atlanta.Corp.Contoso.Com/Users/JPhillips * Example: Jeff Phillips * Example: CN=JPhillips,CN=Users,DC=Atlanta,DC=Corp,DC=contoso,DC=com * Example: Atlanta\JPhillips * Example: fb456636-fe7d-4d58-9d15-5af57d0354c2 * Example: fb456636-fe7d-4d58-9d15-5af57d0354c2@contoso.com * Example: /o=Contoso/ou=AdministrativeGroup/cn=Recipients/cn=JPhillips * Example: Jeff.Phillips@contoso.com * Example: JPhillips@contoso.com .PARAMETER MatchOnExternalEmailAddress The MatchOnExternalEmailAddress parameter specifies to use External Email Address for matching instead of Windows Email Address .PARAMETER DomainController The DomainController parameter specifies the fully qualified domain name (FQDN) of the domain controller that retrieves data from Active Directory. .EXAMPLE This example joins the contact Chris to a user with a matching Windows Email Address .\Join-MailContactAndUser.ps1 -Identity Chris .EXAMPLE This example joins the contact Chris to a user with a matching Windows Email Address .\Join-MailContactAndUser.ps1 -Identity Chris -DomainController MyDC .EXAMPLE This example joins the contact Chris to a user with a Windows Email Address that matches the contact's External Email Address .\Join-MailContactAndUser.ps1 -Identity Chris -MatchOnExternalEmailAddress .EXAMPLE This example joins the contact Chris to a user with a Windows Email Address that matches the contact's External Email Address .\Join-MailContactAndUser.ps1 -Identity Chris -DomainController MyDC -MatchOnExternalEmailAddress #> [CmdletBinding( SupportsShouldProcess=$true, ConfirmImpact="High" )] Param ( [Parameter(Mandatory=$true,Position=0)] [String]$Identity, [Parameter(Mandatory=$false,Position=1)] [switch]$MatchOnExternalEmailAddress, [Parameter(Mandatory=$false,Position=2)] [String]$DomainController ) PROCESS { $parameters = @{} if( $DomainController ) { $parameters.Add( 'DomainController', $DomainController ) Write-Verbose ( 'Using Domain Controller "{0}"' -f $DomainController ) } Write-Verbose ( 'Trying to find a mailcontact for "{0}"' -f $Identity ) $MailContact = get-mailcontact $Identity @parameters -ErrorAction SilentlyContinue if( $MailContact -and -not $MailContact.count ) { if( $MatchOnExternalEmailAddress ) { $UserIdentity = $MailContact.ExternalEmailAddress -replace "SMTP:", "" } else { $UserIdentity = $MailContact.WindowsEmailAddress } Write-Verbose ( 'Trying to find a user for "{0}"' -f $UserIdentity) $User = Get-User -Filter "WindowsEmailAddress -eq '$UserIdentity'" @parameters -ErrorAction SilentlyContinue if( $User -and -not $User.count ) { if( $User.RecipientType -eq 'User' ) { if( $pscmdlet.ShouldProcess($MailContact.DistinguishedName) ) { Write-Verbose ( 'Removing mailcontact "{0}"' -f $MailContact.DistinguishedName ) remove-mailcontact $MailContact.DistinguishedName @parameters -confirm:$false $parameters.add( 'Identity', $User.DistinguishedName ) $parameters.add( 'ExternalEmailAddress', $MailContact.ExternalEmailAddress ) Write-Verbose ( 'Enabling mailuser "{0}"' -f $User.DistinguishedName ) enable-mailuser @parameters | out-Null $parameters.add( 'EmailAddressPolicyEnabled', $False ) $EmailAddresses= @( 'x500:{0}' -f $MailContact.legacyExchangeDN ) foreach( $EmailAddress in $MailContact.EmailAddresses ) { $EmailAddresses += $EmailAddress.ToString() } $parameters.add( 'EmailAddresses', $EmailAddresses ) $parameters.add( 'DisplayName', $MailContact.DisplayName ) $parameters.add( 'Alias', $MailContact.Alias ) $parameters.add( 'CustomAttribute1', $MailContact.CustomAttribute1 ) $parameters.add( 'CustomAttribute2', $MailContact.CustomAttribute2 ) $parameters.add( 'CustomAttribute3', $MailContact.CustomAttribute3 ) $parameters.add( 'CustomAttribute4', $MailContact.CustomAttribute4 ) $parameters.add( 'CustomAttribute5', $MailContact.CustomAttribute5 ) $parameters.add( 'CustomAttribute6', $MailContact.CustomAttribute6 ) $parameters.add( 'CustomAttribute7', $MailContact.CustomAttribute7 ) $parameters.add( 'CustomAttribute8', $MailContact.CustomAttribute8 ) $parameters.add( 'CustomAttribute9', $MailContact.CustomAttribute9 ) $parameters.add( 'CustomAttribute10', $MailContact.CustomAttribute10 ) $parameters.add( 'CustomAttribute11', $MailContact.CustomAttribute11 ) $parameters.add( 'CustomAttribute12', $MailContact.CustomAttribute12 ) $parameters.add( 'CustomAttribute13', $MailContact.CustomAttribute13 ) $parameters.add( 'CustomAttribute14', $MailContact.CustomAttribute14 ) $parameters.add( 'CustomAttribute15', $MailContact.CustomAttribute15 ) $parameters.add( 'ExtensionCustomAttribute1', $MailContact.ExtensionCustomAttribute1 ) $parameters.add( 'ExtensionCustomAttribute2', $MailContact.ExtensionCustomAttribute2 ) $parameters.add( 'ExtensionCustomAttribute3', $MailContact.ExtensionCustomAttribute3 ) $parameters.add( 'ExtensionCustomAttribute4', $MailContact.ExtensionCustomAttribute4 ) $parameters.add( 'ExtensionCustomAttribute5', $MailContact.ExtensionCustomAttribute5 ) Write-Verbose ( 'Updating mailuser "{0}"' -f $User.DistinguishedName ) set-mailuser @parameters } } else { Write-Host ( 'User {0} with recipient type "{1}" cannot be merged' -f $UserIdentity, $User.RecipientType ) -ForegroundColor Red } } elseif( $User.Count -gt 1 ) { Write-Host ( 'Multiple users found for "{0}"' -f $UserIdentity ) -ForegroundColor Red } else { Write-Host ( 'Unable to find a user for "{0}"' -f $UserIdentity ) -ForegroundColor Red } } elseif( $MailContact.Count -gt 1 ) { Write-Host ( 'Multiple mailboxes found for "{0}"' -f $Identity ) -ForegroundColor Red } else { Write-Host ( 'Unable to find a mailbox for "{0}"' -f $Identity ) -ForegroundColor Red } }