Add Phone Numbers to existing AD Contacts

%3CLINGO-SUB%20id%3D%22lingo-sub-1503951%22%20slang%3D%22en-US%22%3EAdd%20Phone%20Numbers%20to%20existing%20AD%20Contacts%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-1503951%22%20slang%3D%22en-US%22%3E%3CP%3EDear%20Community%3C%2FP%3E%3CP%3EWithin%20the%20last%20Days%2C%20i%20had%20to%20import%20~36000%20AD%20Contacts%20from%20Excel.%20I%20came%20from%20basically%20zero%20knowledge%20and%20created%20(copy%2Fpaste%2Fedit)%20following%3A%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EContact%20Import%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3Efunction%20GetUserAttributes(%24ht)%0A%7B%0A%20%20%20%20%24otherAttributes%20%3D%20%40%7B%7D%0A%20%20%20%20foreach%20(%24k%20in%20%24ht.Keys)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20if(-not%20%5BSystem.String%5D%3A%3AIsNullOrWhiteSpace(%24ht%5B%24k%5D))%0A%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24otherAttributes.Add(%24k%2C%24ht%5B%24k%5D)%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20%24otherAttributes%0A%7D%0A%23%23function%20CutLeadTrailBlank(%0A%24Users%20%3D%20Import-XLSX%20-Path%20%22%5C%5Cserver%5Cit%5CGal_export.xlsx%22%0Aforeach%20(%24user%20in%20%24Users)%0A%7B%0A%20%20%20%20%24Displayname%20%3D%20%20%24user.'Givenname'%20%2B%20'%20'%20%2B%20%24user.'surname'%0A%20%20%20%20%24Displayname%20%3D%20%24Displayname.Trim()%0A%0A%20%20%20%20%24ht%20%3D%20%40%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20sn%20%3D%20%24user.'Surname'%0A%20%20%20%20%20%20%20%20%20%20%20%20givenName%20%3D%20%24user.'GivenName'%0A%20%20%20%20%20%20%20%20%20%20%20%20Displayname%20%3D%20%24Displayname%0A%20%20%20%20%20%20%20%20%20%20%20%20mail%20%3D%20%24user.'emailaddress'%0A%20%20%20%20%20%20%20%20%20%20%20%20PostalCode%20%3D%20%24User.'postalcode'%0A%20%20%20%20%20%20%20%20%20%20%20%20physicalDeliveryOfficeName%20%3D%20%24User.'Office'%0A%20%20%20%20%20%20%20%20%20%20%20%20streetAddress%20%3D%20%24User.'Streetaddress'%0A%20%20%20%20%20%20%20%20%20%20%20%20l%20%3D%20%24User.'City'%0A%20%20%20%20%20%20%20%20%20%20%20%20st%20%3D%20%24User.'State'%0A%20%20%20%20%20%20%20%20%20%20%20%20c%20%3D%20%24User.'Country'%0A%20%20%20%20%20%20%20%20%20%20%20%20department%20%3D%20%24User.'Department'%0A%20%20%20%20%20%20%20%20%20%20%20%20Company%20%3D%20%24User.'Company'%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%23'msDS-SourceObjectDN'%20%3D%20'OU%3DUnit3%2COU%3DUnit2D%2COU%3DUnit1%2CDC%3DDomain%2CDC%3Dlocal'%0A%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%24otherAttributes%20%3D%20GetUserAttributes(%24ht)%0A%20%20%20%20%23%23%24password%20%3D%20%24user.Password%20%7C%20ConvertTo-SecureString%20-AsPlainText%20-Force%0A%20%20%20%20if(%24otherAttributes.Count%20-gt%200)%0A%20%20%20%20%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20New-ADObject%20-Type%20contact%20-name%20%24user.Name%20-Path%20'OU%3DUnit3%2COU%3DUnit2D%2COU%3DUnit1%2CDC%3DDomain%2CDC%3Dlocal'%20-OtherAttributes%20%24otherAttributes%0A%20%20%20%20%7D%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EEnable%20Mail%20Contact%3A%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3EAdd-PSSnapin%20Microsoft.Exchange.Management.PowerShell.E2010%3B%0A%0A%0A%24Users%20%3D%20Get-ADObject%20-LDAPFilter%20%22(objectClass%3Dcontact)%22%20-SearchBase%20'OU%3DUnit3%2COU%3DUnit2%2COU%3DUnit1%2CDC%3DDomain%2CDC%3Dlocal'%20-Properties%20Name%2CMail%0A%0AForEach(%24User%20in%20%24Users)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%24Params1%20%3D%20%40%7B%0A%0A%20%20%20%20%20%20%20%20Identity%20%3D%20%24User.'Name'%0A%20%20%20%20%20%20%20%20ExternalEmailAddress%20%3D%20%24User.'Mail'%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20Enable-MailContact%20%40Params1%0A%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EDisable%20EmailAdressPolicy%20and%20replace%20Adresses%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3EAdd-PSSnapin%20Microsoft.Exchange.Management.PowerShell.E2010%3B%0A%0A%24Users%20%3D%20Get-MailContact%20-ResultSize%20unlimited%20-organizationalunit%20'Domain.local%2FUnit1%2FUnit2%2FUnit3'%0A%0AForEach(%24User%20in%20%24Users)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%24Params2%20%3D%20%40%7B%0A%0A%20%20%20%20%20%20%20%20Identity%20%3D%20%24User.'Name'%0A%20%20%20%20%20%20%20%20EmailAddressPolicyEnabled%20%3D%20%24false%0A%20%20%20%20%20%20%20%20EmailAddresses%20%3D%20%24User.'ExternalEmailAddress'%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20Set-Mailcontact%20%40Params2%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EI%20am%20pretty%20sure%20that%20everything%20could%20be%20done%20nicer%20and%20in%20one%20Script%2C%20but%20that%20worked%20well.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3ENow%20i%20got%20a%20new%20File%20with%20just%20MailAdresses%2C%20telephone%20and%20Mobilenumbers%20that%20i%20have%20to%20add.%20How%20to%20start%3F%20My%20Idea%20is%20to%20read%20the%20contacts%2C%20read%20the%20file%2C%20look%20for%20corresponding%20mail%20addresses%20and%20set%20the%20phone%20numbers.%20How%20do%20I%20find%20the%20corresponding%20contact%20in%20AD%20that%20matches%20the%20mail%20address%20from%20the%20File%3F%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EAny%20Help%20appreciated!%3C%2FP%3E%3CP%3EThanks%2C%20Dani%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-1503951%22%20slang%3D%22en-US%22%3E%3CLINGO-LABEL%3EActive%20Directory%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EContact%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EPowerShell%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1510099%22%20slang%3D%22en-US%22%3ERe%3A%20Add%20Phone%20Numbers%20to%20existing%20AD%20Contacts%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-1510099%22%20slang%3D%22en-US%22%3E%3CP%3E%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F717954%22%20target%3D%22_blank%22%3E%40vision311%3C%2FA%3E%26nbsp%3BHello%2C%20Dani.%26nbsp%3B%3CBR%20%2F%3E%3CBR%20%2F%3EYou%20can%20adapt%20this%20snippet%20to%20your%20requirements.%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3E%24ADContacts%20%20%20%3D%20Get-MailContact%20-ResultSize%20unlimited%20-OrganizationalUnit%20'Domain.local%2FUnit1%2FUnit2%2FUnit3'%0A%24PhoneNumbers%20%3D%20Import-Csv%20%22C%3A%5CUsers%5Cemoreno%5CDesktop%5CGal_Export.csv%22%20%23Headers%3A%20MailAdresses%20%7C%20Telephone%20%7C%20Mobilenumber%0A%0AForeach(%24ToSet%20in%20%24PhoneNumbers)%0A%20%7B%0A%20%20%24ContactMatch%3F%20%3D%20%24null%0A%20%20%24ContactMatch%3F%20%3D%20%24ADContacts%20%7C%20Where-Object%7B%24ToSet.MailAdresses%20-like%20%22*%24(%24_.PrimarySmtpAddress)*%22%20%7D%20%0A%20%20%0A%20%20If(%24ContactMatch%3F)%0A%20%20%20%7B%0A%20%20%20%20Write-Host%20%22Match%20found%20for%20%24(%24(%24ContactMatch%3F.PrimarySmtpAddress).Address)%22%20-ForegroundColor%20Cyan%0A%20%20%20%20Set-Contact%20-Identity%20%24(%24ContactMatch%3F.Identity)%20-Phone%20%24ToSet.Telephone%0A%20%20%20%20Set-Contact%20-Identity%20%24(%24ContactMatch%3F.Identity)%20-OtherTelephone%20%24ToSet.Mobilenumber%0A%20%20%20%7D%0A%20%20Else%0A%20%20%20%7B%0A%20%20%20%20Write-Host%20%22No%20Mail%20Address%20Match%20for%20%24(%24ToSet.MailAddresses)%22%20-ForegroundColor%20Yellow%0A%20%20%20%7D%0A%20%7D%0A%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3ERegards%3C%2FP%3E%3CP%3EErick%20Moreno%3C%2FP%3E%3C%2FLINGO-BODY%3E
Occasional Visitor

Dear Community

Within the last Days, i had to import ~36000 AD Contacts from Excel. I came from basically zero knowledge and created (copy/paste/edit) following:

 

Contact Import

 

 

function GetUserAttributes($ht)
{
    $otherAttributes = @{}
    foreach ($k in $ht.Keys)
    {
         if(-not [System.String]::IsNullOrWhiteSpace($ht[$k]))
         {
            $otherAttributes.Add($k,$ht[$k])
         }
    }
    $otherAttributes
}
##function CutLeadTrailBlank(
$Users = Import-XLSX -Path "\\server\it\Gal_export.xlsx"
foreach ($user in $Users)
{
    $Displayname =  $user.'Givenname' + ' ' + $user.'surname'
    $Displayname = $Displayname.Trim()

    $ht = @{
            sn = $user.'Surname'
            givenName = $user.'GivenName'
            Displayname = $Displayname
            mail = $user.'emailaddress'
            PostalCode = $User.'postalcode'
            physicalDeliveryOfficeName = $User.'Office'
            streetAddress = $User.'Streetaddress'
            l = $User.'City'
            st = $User.'State'
            c = $User.'Country'
            department = $User.'Department'
            Company = $User.'Company'
            ##'msDS-SourceObjectDN' = 'OU=Unit3,OU=Unit2D,OU=Unit1,DC=Domain,DC=local'
         }

            
    $otherAttributes = GetUserAttributes($ht)
    ##$password = $user.Password | ConvertTo-SecureString -AsPlainText -Force
    if($otherAttributes.Count -gt 0)
    
    {
       New-ADObject -Type contact -name $user.Name -Path 'OU=Unit3,OU=Unit2D,OU=Unit1,DC=Domain,DC=local' -OtherAttributes $otherAttributes
    }
}

 

 

 

 

 

Enable Mail Contact:

 

 

 

 

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010;


$Users = Get-ADObject -LDAPFilter "(objectClass=contact)" -SearchBase 'OU=Unit3,OU=Unit2,OU=Unit1,DC=Domain,DC=local' -Properties Name,Mail

ForEach($User in $Users)
        {
        
        $Params1 = @{

        Identity = $User.'Name'
        ExternalEmailAddress = $User.'Mail'
        }
    
    Enable-MailContact @Params1

}

 

 

 

 

 

Disable EmailAdressPolicy and replace Adresses

 

 

 

 

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010;

$Users = Get-MailContact -ResultSize unlimited -organizationalunit 'Domain.local/Unit1/Unit2/Unit3'

ForEach($User in $Users)
        {
        
        $Params2 = @{

        Identity = $User.'Name'
        EmailAddressPolicyEnabled = $false
        EmailAddresses = $User.'ExternalEmailAddress'
        }

    Set-Mailcontact @Params2
}

 

 

 

 

I am pretty sure that everything could be done nicer and in one Script, but that worked well.

 

Now i got a new File with just MailAdresses, telephone and Mobilenumbers that i have to add. How to start? My Idea is to read the contacts, read the file, look for corresponding mail addresses and set the phone numbers. How do I find the corresponding contact in AD that matches the mail address from the File?

 

Any Help appreciated!

Thanks, Dani

 

1 Reply

@vision311 Hello, Dani. 

You can adapt this snippet to your requirements. 

$ADContacts   = Get-MailContact -ResultSize unlimited -OrganizationalUnit 'Domain.local/Unit1/Unit2/Unit3'
$PhoneNumbers = Import-Csv "C:\Users\emoreno\Desktop\Gal_Export.csv" #Headers: MailAdresses | Telephone | Mobilenumber

Foreach($ToSet in $PhoneNumbers)
 {
  $ContactMatch? = $null
  $ContactMatch? = $ADContacts | Where-Object{$ToSet.MailAdresses -like "*$($_.PrimarySmtpAddress)*" } 
  
  If($ContactMatch?)
   {
    Write-Host "Match found for $($($ContactMatch?.PrimarySmtpAddress).Address)" -ForegroundColor Cyan
    Set-Contact -Identity $($ContactMatch?.Identity) -Phone $ToSet.Telephone
    Set-Contact -Identity $($ContactMatch?.Identity) -OtherTelephone $ToSet.Mobilenumber
   }
  Else
   {
    Write-Host "No Mail Address Match for $($ToSet.MailAddresses)" -ForegroundColor Yellow
   }
 }

 

Regards

Erick Moreno