Tuesday, July 31, 2018

Updating Contact Information in Office 365 from CSV via PowerShell

Some time ago, we did an export of our Domino contacts into the Office 365 address book. It was mostly successful and we got the users and their email addresses but missed a lot of detail on the phone numbers, company names and fax numbers. 

At the time it didn't matter but recently we reached a point where we needed this information to be present. 

The process was much fiddlier than it should have been, so here's how we did it.

Exporting out of Domino

This was easy, literally a five minute job for about 5000+ contacts. Domino has menu options to export as CSV, so I won't go into detail here.

The end result is that you should have a CSV file that looks something like this;

ExternalEmailAddress,FirstName,LastName,Name,Title,Company,Phone,MobilePhone,Fax,StreetAddress,City,StateorProvince,PostalCode,CountryOrRegion
atano@clonewars.com,Ashoka,Tano,Ashoka Tano,,Cartoon Network,08 8988 9889,,,,,,,
ynotfar@dagpbah.com,Yoda,Not Far,Yoda Not Far,Jedi Master,Food of this Kind Ltd,,,,GPO Box 1234,Dagobah,,1556,Dagobah System
pkoon@jeditemple.com,Plo,Koon,Plo Koon,Jedi Master,Plo's Mask Emporium,03 5468 4889,0417 650 456,03 5406 8790,"Jedi Temple, Suite 66",Coruscant,COR,1234,Central Systems
spalpatine@dualidentities.com,Sheev,Palpatine,Sheev Palpatine,Chancellor,Always Two Limited,02 1264 5640,0442 548 987,02 8987 9802,"Red Suite, Level 4000",Coruscant,,,Central Systems

Ideally, you'll be able to paste that test data into notepad, save as CSV and have a working template but just in case you can't, it's essentially 14 fields;



  • ExternalEmailAddress
  • FirstName
  • LastName
  • Name
  • Title
  • Company
  • Phone
  • MobilePhone
  • Fax
  • StreetAddress
  • City
  • StateorProvince
  • PostalCode
  • CountryOrRegion



PowerShell

From here, you start PowerShell (in Administrator Mode) and connect to Office 365

Set-ExecutionPolicy RemoteSigned

$UserCredential = Get-Credential

You'll be prompted to sign in with an Office 365 ID that has global admin rights.

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection

Import-PSSession $Session

In this next step, we're presuming that your CSV file is saved as C:\temp\AllPeople.csv.  If you saved it elsewhere or under a different name, you'll need to update that line.

$Contacts = Import-CSV C:\temp\AllPeople.csv

The next section says which fields to import. We discovered that there were a lot of problems with this statement. 

  • If you include fields which aren't in your CSV, then no fields get imported. 
  • If ONE field breaks the rules (eg: a company with a length of over 64 characters, then that will eventually halt the processing of the entire input file). In our case, I used Excel to return Left(CompanyName, 62) where Len(CompanyName) > 62.  It fixed a big problem. 


$contacts | ForEach {Set-Contact $_.Name -StreetAddress $_.StreetAddress -City $_.City -StateorProvince $_.StateorProvince -PostalCode $_.PostalCode -Phone $_.Phone -MobilePhone $_.MobilePhone -Company $_.Company -Title $_.Title -Fax $_.Fax}

You should still expect quite a few errors when running this command as names which don't match perfectly from one system to another, particularly those with accent characters, will most likely fail.

As usual, you'll want to finish up with;

Remove-PSSession $Session
To clear any variables out 

and 
Exit
to close the Powershell window. 

You should be able to see the results in Office 365 immediately. 

No comments: