批量Azure AD更新

问题描述

我已经编写了一个脚本来更新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命令行运行脚本,它将无法正常工作。

在这里想念什么?

解决方法

创建命令字符串然后执行它们将导致我认为不良做法。您将不得不诉诸Invoke-Expression。这是我们要避免的事情。我将使用您的参数构建一个哈希表,并使用splatting.,然后,您可以构建命令字符串以发送到信息流。参见下面的示例。

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
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...