Массовое обновление Azure AD

#powershell #azure-ad-powershell-v2

#powershell #azure-ad-powershell-v2

Вопрос:

Я написал скрипт для обновления контактной информации пользователей в Azure AD. CSV, который я использую, является экспортом из нашего локального AD. Я нашел несколько примеров в качестве отправной точки, и это то, что я вырезал…

 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
  

Он отлично выполняет и создает команду. Однако ни один из пользователей не обновляется. Если я скопирую / пропущу команду из файла transcript.log, это сработает. Это просто не сработает, если я запущу скрипт из командной строки PowerShell.

Чего мне здесь не хватает?

Комментарии:

1. Вывод командной строки не приведет к ее вызову. Вам нужно каким-то образом вызвать его. Вы могли бы попробовать с оператором вызова amp; $command .

2. Я подумал то же самое и нашел Invoke-Command и попробовал это, но это не сработало. Я попробую ваше.

3. Я вернулся и вставил ‘amp;’, и это, похоже, заставило скрипт выполнить команду. Однако все они не смогли выполнить попытку / перехват. Я взял его из trascript.log и скопировал, вставил в командную строку, и это сработало. Есть идеи о том, как я могу заставить скрипт выводить причину неудачной попытки?

4. Я вижу проблему amp; не удается проанализировать строки. Итак, вы хотите иметь возможность видеть команду до ее запуска, а затем запускать ее?

5. Я не знаю способа сделать это без использования Invoke-Expression , который никогда не следует использовать.

Ответ №1:

Я думаю, что создание командных строк и их последующее выполнение приведет к неправильным методам. Вам придется прибегнуть к Invoke-Expression . Это то, чего мы хотим избежать. Я бы создал хэш-таблицу с вашими параметрами и использовал разбиение. Исходя из этого, вы можете создать свою командную строку для отправки в информационный поток. Смотрите пример ниже.

 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})"
    amp; $command @params
}
  

Комментарии:

1. Спасибо, @AdminOfThings. Это заставило скрипт работать, и я узнал кое-что очень ценное.