powershellazure-ad-powershell-v2

Bulk Azure AD Update


I have written a script to update the users' contact information in Azure AD. The CSV I'm using is an export from our local AD. I found some examples as a starting place and this is what I have hacked out ...

Start-Transcript "transcript.log"

# Connect to AzureAD
Connect-AzureAD

# Get CSV content
$CSVrecords = Import-Csv userexport.csv -Delimiter ","

# Create arrays for skipped and failed users
$SkippedUsers = @()
$FailedUsers = @()

# Loop trough CSV records
foreach ($CSVrecord in $CSVrecords) {
    $upn = $CSVrecord.samaccountname + "@daytonrogers.com"
    $user = Get-AzureADUser -Filter "userPrincipalName eq '$upn'"
    if ($user) {
        $command = "Set-AzureADUser -ObjectID $($user.objectid) "
        if ($CSVrecord.title) {$command = "$command -jobtitle '$($CSVrecord.title)'"}
        if ($CSVrecord.department) {$command = "$command -department '$($CSVrecord.department)'"}
        if ($CSVrecord.office) {$command = "$command -PhysicalDeliveryOfficeName '$($CSVrecord.office)'"}
        if ($CSVrecord.officephone) {$command = "$command -TelephoneNumber '$($CSVrecord.officephone)'"}
        if ($CSVrecord.fax) {$command = "$command -FacsimileTelephoneNumber '$($CSVrecord.fax)'"}
        if ($CSVrecord.mobilephone) {$command = "$command -Mobile '$($CSVrecord.mobilephone)'"}
        if ($CSVrecord.streetaddress) {$command = "$command -streetaddress '$($CSVrecord.streetaddress)'"}
        if ($CSVrecord.city) {$command = "$command -city '$($CSVrecord.city)'"}
        if ($CSVrecord.state) {$command = "$command -state '$($CSVrecord.state)'"}
        if ($CSVrecord.postalcode) {$command = "$command -postalcode '$($CSVrecord.postalcode)'"}
        Write-Information $command
        try{
            $command
        } catch {
            $FailedUsers += $upn
            Write-Warning "$upn user found, but FAILED to update."
            }
        }
        else {
            Write-Warning "$upn not found, skipped"
            $SkippedUsers += $upn
        }
}
Stop-Transcript

It runs and builds the command just fine. However, none of the users get updated. If I copy / past the command from the transcript.log file, it works. It just does not work if I run the script from the PowerShell command line.

What am I missing here?


Solution

  • Creating command strings and then executing them is going to lead to bad practices I think. You will have to resort to Invoke-Expression. That is something we want to avoid. I would build a hash table with your parameters and use splatting. From that, you can build your command string to send to the information stream. See below for an example.

    if ($user) {
        $command = "Set-AzureADUser"
        $params = @{}
        $params.ObjectID = $user.objectid
        if ($CSVrecord.title) {$params.jobtitle = $CSVrecord.title}
        if ($CSVrecord.department) {$params.department = $CSVrecord.department}
        if ($CSVrecord.office) {$params.PhysicalDeliveryOfficeName = $CSVrecord.office}
        if ($CSVrecord.officephone) {$params.TelephoneNumber = $CSVrecord.officephone}
        if ($CSVrecord.fax) {$params.FacsimileTelephoneNumber = $CSVrecord.fax}
        if ($CSVrecord.mobilephone) {$params.Mobile = $CSVrecord.mobilephone}
        if ($CSVrecord.streetaddress) {$params.streetaddress = $CSVrecord.streetaddress}
        if ($CSVrecord.city) {$params.city = $CSVrecord.city}
        if ($CSVrecord.state) {$params.state = $CSVrecord.state}
        if ($CSVrecord.postalcode) {$params.postalcode = $CSVrecord.postalcode}
        Write-Information "$command $($params.GetEnumerator() |% {"-{0} '{1}'" -f $_.Key,$_.Value})"
        & $command @params
    }