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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:45:24