SCCM Powershell 非常详细的部署状态消息

SCCM Powershell very detailed Deployment Status messages

这里是 SCCM 新用户,请原谅术语。

我正在尝试使用 Powershell 获取部署任务序列的部署的详细进度消息。下面的命令显示了部署的状态,但我想显示任务序列每个步骤的状态消息。

管理控制台在

下显示此数据

监控->部署->资产详细信息->双击设备->单击状态选项卡。状态选项卡包含以下列。执行时间、步骤、操作名称、组名称、最后一条消息名称、最后一条消息 ID、退出代码、操作输出

Get-CMDeploymentStatus -DeploymentId $depID | Get-CMDeploymentStatusDetails  | Where DeviceName -eq $computername

版本:SCCM 1802

我认为没有方便的 powershell cmdlet 来获取此信息,但是控制台中的所有信息基本上都是通过 wmi 来自站点服务器的,您可以按照控制台执行操作的方式完全相同。

了解有一个日志文件 "SMSProv.log" 告诉您控制台为您打开的每个对话框执行的操作是多么的好。它位于您在子文件夹日志中安装 ConfigMgr 的站点服务器上(因此默认为 %Program Files%\Microsoft Configuration Manager\Logs)。

如果按照您的描述打开状态选项卡后检查它,它将显示两个命令行:

WMI:

SELECT * FROM SMS_TaskSequenceExecutionStatus WHERE AdvertisementID='<DeploymentID>' AND PackageID='<PackageID>' AND ResourceID='<ResourceID>' ORDER BY Step

SQL:

select  all __askSequenceExecutionStatus0.ActionName,__askSequenceExecutionStatus0.ActionOutput,__askSequenceExecutionStatus0.AdvertisementID,__askSequenceExecutionStatus0.ExecutionTime,__askSequenceExecutionStatus0.ExitCode,__askSequenceExecutionStatus0.GroupName,__askSequenceExecutionStatus0.LastStatusMsgID,__askSequenceExecutionStatus0.LastStatusMsgName,__askSequenceExecutionStatus0.PackageID,__askSequenceExecutionStatus0.ResourceID,__askSequenceExecutionStatus0.Step from vSMS_TaskSequenceExecutionStatus AS __askSequenceExecutionStatus0  where ((__askSequenceExecutionStatus0.AdvertisementID = '<DeploymentID>' AND __askSequenceExecutionStatus0.PackageID = '<PackageID>') AND __askSequenceExecutionStatus0.ResourceID = '<ResourceID>') order by __askSequenceExecutionStatus0.Step

您可以同时使用两者来获取您的信息。一般规则是 WMI 在权限管理方面更好,但对于复杂的事情 sql 可能要快得多。如果您想对更多数据进行复杂的连接而不仅仅是控制台显示的数据,这也是唯一可能的方法。 (它还需要更多权限,因为您必须直接连接到 sccmdb 才能使用它)

因此,在您的情况下,使用 WMI 可能更容易。所以你会使用类似的东西:

gwmi -ComputerName <SiteServer>-Namespace 'Root\SMS\site_<SiteCode>' -Query "SELECT * FROM SMS_TaskSequenceExecutionStatus WHERE AdvertisementID='<DeploymentID>' AND PackageID='<PackageID>' AND ResourceID='<ResourceID>' ORDER BY Step"

然后从那里开始工作。如果您更喜欢 SQL 它会稍微复杂一些(此代码会生成某种 csv 输出,但您当然也可以生成自己的对象)

$connStr = "Server=<sccm db server>;Database=<sccm db>;Integrated Security=SSPI"
$SQLConnection = New-Object System.Data.SqlClient.SqlConnection
$SQLConnection.ConnectionString = $connStr
$SQLConnection.Open()

$SQLQuery = "select  all __askSequenceExecutionStatus0.ActionName,__askSequenceExecutionStatus0.ActionOutput,__askSequenceExecutionStatus0.AdvertisementID,__askSequenceExecutionStatus0.ExecutionTime,__askSequenceExecutionStatus0.ExitCode,__askSequenceExecutionStatus0.GroupName,__askSequenceExecutionStatus0.LastStatusMsgID,__askSequenceExecutionStatus0.LastStatusMsgName,__askSequenceExecutionStatus0.PackageID,__askSequenceExecutionStatus0.ResourceID,__askSequenceExecutionStatus0.Step from vSMS_TaskSequenceExecutionStatus AS __askSequenceExecutionStatus0  where ((__askSequenceExecutionStatus0.AdvertisementID = @DeploymentID AND __askSequenceExecutionStatus0.PackageID = @PackageID) AND __askSequenceExecutionStatus0.ResourceID = @ResourceID) order by __askSequenceExecutionStatus0.Step"

$SQLCommand = New-Object System.Data.SqlClient.SqlCommand($SQLQuery, $SQLConnection)
[Void]$SQLCommand.Parameters.AddWithValue("@DeploymentID", "<DeplyomentID>")
[Void]$SQLCommand.Parameters.AddWithValue("@PackageID", "<PackageID>")
[Void]$SQLCommand.Parameters.AddWithValue("@ResourceID", "<ResoruceID>")
$reader = $SQLCommand.ExecuteReader()

if ($reader.HasRows) {
    while($reader.Read()) {
        $line = ""
        for ($i=0; $i -lt $reader.FieldCount; $i++) {
            $line += $reader[$i].ToString() + ","
        }
        $line
    }
}
$SQLConnection.Close()