如何用PowerShell+CIM/WMI检查Azure Windows VM的SCCM任务序列状态
远程检查SCCM任务序列完成状态的PowerShell实现方案
核心逻辑
通过CIM远程调用(无需登录目标VM)查询SCCM相关WMI类,直接获取任务序列的执行状态。关键依赖两个WMI类:SMS_TaskSequenceExecutionStatus(记录任务序列的执行详情)和SMS_Client(确认客户端是否就绪)。
前置要求
- 执行脚本的机器需拥有目标VM的管理员权限,且Azure NSG需开放WMI远程端口(HTTP用5985,HTTPS用5986)。
- 目标VM已完成SCCM客户端安装并成功注册到站点。
具体步骤
1. 建立远程CIM会话
先创建持久化的CIM会话,减少重复连接开销:
$targetVmName = "你的目标VM名称" $adminCred = Get-Credential -Message "输入目标VM的管理员账号密码" $cimSession = New-CimSession -ComputerName $targetVmName -Credential $adminCred -SessionOption (New-CimSessionOption -Protocol Wsman)
2. 查询任务序列执行状态
从root\ccm\Policy\Machine\ActualConfig命名空间下的SMS_TaskSequenceExecutionStatus类,获取最新的任务序列执行记录:
# 按结束时间倒序取最新一条任务序列记录 $latestTsStatus = Get-CimInstance -CimSession $cimSession -Namespace "root\ccm\Policy\Machine\ActualConfig" -ClassName "SMS_TaskSequenceExecutionStatus" | Sort-Object EndTime -Descending | Select-Object -First 1
3. 循环等待任务序列完成
根据ExecutionState属性判断状态:
0:未启动1:正在执行2:执行完成3:执行失败
封装等待逻辑:
$checkInterval = 300 # 每5分钟检查一次(单位:秒) $maxWaitTime = 3600 # 最大等待1小时(单位:秒) $elapsedTime = 0 while ($elapsedTime -lt $maxWaitTime) { $latestTsStatus = Get-CimInstance -CimSession $cimSession -Namespace "root\ccm\Policy\Machine\ActualConfig" -ClassName "SMS_TaskSequenceExecutionStatus" | Sort-Object EndTime -Descending | Select-Object -First 1 switch ($latestTsStatus.ExecutionState) { 2 { Write-Host "任务序列已成功完成" break } 3 { Write-Host "任务序列执行失败:$($latestTsStatus.ErrorMessage)" throw "任务序列执行失败" } default { Write-Host "任务序列执行中,已等待$elapsedTime秒,继续等待..." Start-Sleep -Seconds $checkInterval $elapsedTime += $checkInterval } } } if ($elapsedTime -ge $maxWaitTime) { Write-Host "等待超时,任务序列未在指定时间内完成" throw "等待超时" }
4. 清理远程会话
检查完成后关闭CIM会话:
Remove-CimSession -CimSession $cimSession
额外优化点
- 若VM刚重启,可先等待SCCM客户端就绪:
$clientState = Get-CimInstance -CimSession $cimSession -Namespace "root\ccm" -ClassName "SMS_Client" if ($clientState.ClientState -eq 0) { Write-Host "SCCM客户端未就绪,等待2分钟..." Start-Sleep -Seconds 120 }
内容的提问来源于stack exchange,提问作者Digger
相关产品推荐
相关产品推荐

