Created this script for a client to Bulk update contacts to allow customer Exchage Online address lists to be created.

The customer had over 2000+ contacts seperated in OU's in their OnPrem exchange and needed the address lists to function the same in Exchange Online as on Prem. To keep things simple decided use extensionAttribute1 as the AD field to update with the value to be used for the custom address list in Exchange Online

 

PowerShell
Edit|Remove
#requires -version 4 
 
<# 
 
.SYNOPSIS 
 
  This Script updates the Custom Atrtribute for creation of custom address lists in Office 365 
 
 
 
.DESCRIPTION 
 
  The script reads all contacts in a searchbase OU and reads them into an array, which then loops through all items and sets the specific defined custom attribute 
 
 
 
.PARAMETER  
 
  none 
 
 
 
.INPUTS 
 
  SearchBase in the form of user input 
 
  AttributeValue in the form of user input 
 
 
.OUTPUTS Log File 
 
  The script log file stored in C:\Scripts\Logs\UpdateContact.log 
 
 
 
.NOTES 
 
  Version:        1.0 
 
  Author:         Steve McIntyre, Fujitsu New Zealand Limited 
 
  Creation Date:  6th June 2018 
 
  Purpose/Change: Initial script development 
 
 
 
.EXAMPLE 
 
  .\UpdateContact.ps1 
 
   
#> 
 
 
 
#---------------------------------------------------------[Script Parameters]------------------------------------------------------ 
 
 
 
Param ( 
 
  #Script parameters go here 
 
) 
 
 
 
#---------------------------------------------------------[Initialisations]-------------------------------------------------------- 
 
 
 
#Set Error Action to Silently Continue 
 
$ErrorActionPreference = 'SilentlyContinue' 
 
 
 
#Import Modules & Snap-ins 
 
Import-Module PSLogging 
 
 
 
#----------------------------------------------------------[Declarations]---------------------------------------------------------- 
 
 
 
#Script Version 
 
$sScriptVersion = '1.0' 
 
 
 
#Log File Info 
 
$sLogPath = 'C:\Scripts\Logs' 
 
$sLogName = 'UpdateContact.log' 
 
$sLogFile = Join-Path -Path $sLogPath -ChildPath $sLogName 
 
#Custom Variables 
 
$global:Contacts = '' #Global Variable for Contacts Array 
$global:SearchBase = '' #Global Variable for SearchBase 
$global:AttributeValue = '' #Global Varailbe for CustomAtrribute1 value 
 
 
#-----------------------------------------------------------[Functions]------------------------------------------------------------ 
 
 
Function GetInputs { 
 
  Param () 
 
 
 
  Begin { 
 
    Write-LogInfo -LogPath $sLogFile -Message 'Populate the Global Variables' 
 
  } 
 
 
 
  Process { 
 
    Try { 
 
      Write-LogInfo -LogPath $sLogFile -Message 'Populate the SeachBase' 
 
      $global:SearchBase = Read-Host -Prompt 'Enter the SearchBase OU: e.g. OU=Suppliers,OU=Managed Contacts,OU=COE,DC=mydomain,DC=co,DC=nz' #Change to your domain 
 
      Write-LogInfo -LogPath $sLogFile -Message "Using $global:SearchBase as OU target" 
 
      Write-LogInfo -LogPath $sLogFile -Message 'Write Contacts to contacts array' 
 
      $global:Contacts = Get-ADObject -Filter 'objectClass -eq "contact"' -SearchBase $global:SearchBase -Properties DistinguishedName | Select -ExpandProperty DistinguishedName 
 
      Write-LogInfo -LogPath $sLogFile -Message "The following contacts have been written to the array $global:Contacts" 
 
      $global:AttributeValue = Read-Host -Prompt 'Enter the value for CustomAttribute1: e.g. Supplier' 
 
      Write-LogInfo -LogPath $sLogFile -Message "$global:AttributeValue will be written to CustomAttribute1" 
 
    } 
 
 
 
    Catch { 
 
      Write-LogError -LogPath $sLogFile -Message $_.Exception -ExitGracefully 
 
      Break 
 
    } 
 
  } 
 
 
 
  End { 
 
    If ($?) { 
 
      Write-LogInfo -LogPath $sLogFile -Message 'Variables Updated Successfully.' 
 
      Write-LogInfo -LogPath $sLogFile -Message ' ' 
 
    } 
 
  } 
 
} 
 
Function UpdateContact { 
 
  Param () 
 
 
 
  Begin { 
 
    Write-LogInfo -LogPath $sLogFile -Message 'Updating Contacts CustomAttribute1 field' 
 
  } 
 
 
 
  Process { 
 
    Try { 
 
      #loop through each member of the Contacts Array and set CustomAttribute1 
 
      Foreach ($contact in $global:Contacts) 
      { 
 
      Write-LogInfo -LogPath $sLogFile -Message "Updating $contact" 
 
      Set-ADObject -Identity $contact -Add @{extensionAttribute1 = "$global:AttributeValue"-WhatIf #default will run with whatif to apply changes comment out -WhatIf 
 
 
      }  
 
    } 
 
 
 
    Catch { 
 
      Write-LogError -LogPath $sLogFile -Message $_.Exception -ExitGracefully 
 
      Break 
 
    } 
 
  } 
 
 
 
  End { 
 
    If ($?) { 
 
      Write-LogInfo -LogPath $sLogFile -Message 'Contacts Updated Successfully.' 
 
      Write-LogInfo -LogPath $sLogFile -Message ' ' 
 
    } 
 
  } 
 
} 
 
 
#-----------------------------------------------------------[Execution]------------------------------------------------------------ 
 
 
 
Start-Log -LogPath $sLogPath -LogName $sLogName -ScriptVersion $sScriptVersion 
 
#Script Execution goes here 
GetInputs 
UpdateContact 
 
Stop-Log -LogPath $sLogFile