You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell脚本AD同步执行顺序异常,无法为新用户分配许可证

AD同步未及时完成导致Office 365许可证分配失败

我是PowerShell新手,正在编写用于创建AD用户并为其分配许可证的脚本。但无论如何调整,AD同步命令都无法在等待周期前执行,导致后续无法找到用户来分配许可证。另外,Write-Output "testing"总是在AD同步命令之后输出,脚本因用户未同步到Office 365而报错。

附上用户的原始脚本:

$DCSync = 'DC01'

#Starts AD Sync
Invoke-Command -ComputerName $DCSync -scriptblock {
Import-Module ADSync
Start-ADSyncSyncCycle -PolicyType Delta
Write-Output "testing"
}

send-mailmessage -From "abc@test123.co.uk" -To "abcHelpdesk@test123.co.uk" -Subject "New user creation" -Body "Please connect to DC01 and authenticate to Office 365 to complete the user setup for $UserPrincipalName" -SmtpServer [REDACTED]
Start-Countdown -Seconds 5 -Message "Synchronizing changes to Office 365"

#Install-Module PowerShellGet
#Install-Module Microsoft.Graph -Scope CurrentUser
#Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Connect-MgGraph -Scopes User.ReadWrite.All, Organization.Read.All

$MgUserID = Get-MgUser -UserId "$EmailAddress"

Update-MgUser -UserId "$MgUserID" -UsageLocation GB

Set-MgUserLicense -UserId $MgUserID -AddLicenses @{SkuId = "6fd2c87f-b296-42f0-b197-1e91e994b900" } -RemoveLicenses @()

问题根源

  1. Start-ADSyncSyncCycle仅触发同步,不等待完成
    该命令只是向AD同步服务发送启动增量同步的指令,不会阻塞脚本等待同步任务实际完成。你的脚本触发同步后立刻执行后续操作,但此时AD到Office 365的同步可能还在后台运行,用户数据未同步到云,因此Get-MgUser找不到目标用户。

  2. Invoke-Command输出顺序的误解
    远程脚本块里的Write-Output "testing"在Start-ADSyncSyncCycle之后执行是正常逻辑——前者只是启动任务,不会暂停脚本执行,所以远程脚本会立刻继续执行输出语句,这并不代表同步已经完成。


解决方法

修改脚本,等待同步完成再执行后续操作

调整Invoke-Command的脚本块,添加同步状态检查逻辑,确保AD同步完成后再进行Office 365相关操作:

$DCSync = 'DC01'

# 启动AD同步并等待任务完成
Invoke-Command -ComputerName $DCSync -ScriptBlock {
    Import-Module ADSync
    # 启动增量同步
    Start-ADSyncSyncCycle -PolicyType Delta -ErrorAction Stop
    Write-Output "已触发AD增量同步,等待任务完成..."
    # 循环检查Azure AD连接器的同步状态
    do {
        $syncStatus = Get-ADSyncConnectorRunStatus | Where-Object { $_.ConnectorName -match 'Azure AD' }
        Start-Sleep -Seconds 3
    } while ($syncStatus.Status -eq 'Running')
    Write-Output "AD增量同步已完成"
}

# 同步完成后发送通知邮件
send-mailmessage -From "abc@test123.co.uk" -To "abcHelpdesk@test123.co.uk" -Subject "New user creation" -Body "AD同步已完成,正在为 $UserPrincipalName 配置Office 365许可证" -SmtpServer [REDACTED]

Connect-MgGraph -Scopes User.ReadWrite.All, Organization.Read.All

# 添加云端重试逻辑,避免同步完成后的数据延迟
$retryCount = 0
$maxRetries = 10
do {
    $MgUserID = Get-MgUser -UserId "$EmailAddress" -ErrorAction SilentlyContinue
    if ($MgUserID) { break }
    $retryCount++
    Write-Output "未找到云用户,第 $retryCount 次重试..."
    Start-Sleep -Seconds 10
} while ($retryCount -lt $maxRetries)

# 若多次重试仍未找到用户,终止脚本
if (-not $MgUserID) {
    Write-Error "重试 $maxRetries 次后仍未找到用户 $EmailAddress,终止操作"
    exit 1
}

Update-MgUser -UserId $MgUserID.Id -UsageLocation GB
Set-MgUserLicense -UserId $MgUserID.Id -AddLicenses @{SkuId = "6fd2c87f-b296-42f0-b197-1e91e994b900" } -RemoveLicenses @()

关键调整说明

  • 等待AD同步完成:通过Get-ADSyncConnectorRunStatus监控Azure AD连接器的运行状态,直到同步任务结束。
  • 云端延迟重试:AD同步完成后,Office 365可能存在短暂的数据同步延迟,因此添加循环重试Get-MgUser的逻辑,避免直接报错。
  • 移除无效固定等待:原脚本的5秒倒计时完全不足以完成同步,替换为基于状态的动态等待逻辑。

内容的提问来源于stack exchange,提问作者S3RRATED

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:16:16