当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 强制 SCCM 分发点刷新失败的包

作者:精品下载站 日期:2024-12-14 07:16:05 浏览:14 分类:玩电脑

强制 SCCM 分发点刷新失败的包


如果 System Center Configuration Manager 中的分发点出现了失败的包,则可能有原因,并且重新发送包可能不是问题的正确解决方案。

但我需要在分发点上重新发送所有失败的包,而且我没有心情在 GUI 中单击,因此我研究了 MSDN 上列出的 WMI 类:http://msdn.microsoft.com/en-us/库/hh949540.aspx

首先,我要寻找的是某个分发点上的包。这些列在此处记录的类 SMS_PackageStatusDistPointsSummarizer 中:http://msdn.microsoft.com/en-us/library/hh949126.aspx

该类有一个名为 State 的属性,具有以下可用状态:


0INSTALLED
1INSTALL_PENDING

2INSTALL_RETRYING

3INSTALL_FAILED

4REMOVAL_PENDING

5REMOVAL_RETRYING

6REMOVAL_FAILED

首先,我在状态为 2 或 3 后过滤了包,但没有明显的属性包含分发点的名称,只有属性 ServerNALPath。

经过对 MSDN 的进一步挖掘,我发现了 WMI 类 SMS_DistributionPointInfo,它可用于检索分发点的名称和 ServerNALPath。赢!

因此,对于初学者来说,获取分发点信息:

$Query = "Select NALPath,Name From SMS_DistributionPointInfo Where ServerName Like '%$DistPoint%'"
$DistributionPoint = @(Get-WmiObject -Namespace "rootSMSSite_$SiteCode" -Query $Query)
$ServerNalPath = $DistributionPoint.NALPath

在第一行,我使用运算符“Like”,它在 WQL 中通过使用“%”和类似正则表达式的语法来支持通配符(稍后会详细介绍)。

在第二行,我使用了一个技巧将结果返回到数组中,这就是 @() 的全部内容。这样,即使查询只返回一项,我也可以获得 $DistributionPoint 上的属性 Count。

然后我需要找到该分发点中所有失败或重试的包。首先我尝试了这样的事情:

$Query = "Select PackageID From SMS_PackageStatusDistPointsSummarizer Where ServerNALPath Like '$ServerNALPath' AND (State = 2 OR state = 3)"
$FailedPackages = Get-WmiObject -Namespace "rootSMSSite_$SiteCode" -Query $Query

但是等等,这给了我一个错误说明:

Get-WmiObject : Invalid query “Select PackageID From SMS_PackageStatusDistPointsSummarizer Where ServerNALPath Like ‘[“Display=\SERVER01.
lab.lcl”]MSWNET:[“SMS_SITE=S01″]\SERVER01.lab.lcl’ AND (State = 2 OR state = 3)”
At line:1 char:23
+ $FailedPackages = Get-WmiObject -Namespace “rootSMSSite_$SiteCode” -Query …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

问题是 ServerNALPath 包含括号“[]”,它告诉 WQL 查找括号之间的字符之一,但找不到我想要的。解决这个问题的方法是用括号将 [-char 括起来,如下所示:“[[]”告诉 WQL 查找字符“[”上的任何字符,这只是一个字符。由于 WQL 不会解释左括号,因此右括号“]”也将被忽略。下一个问题是反斜杠“ ”是一个转义字符,告诉 WQL 下一个字符应该按字面解释而不是特殊字符,这意味着\将仅转换为 。为了解决这个问题,我们还必须用 .

通过在 $ServerNalPath 上使用替换运算符,这两个操作都可以在 PowerShell 中轻松完成:

$ServerNalPath=$DistributionPoint.NALPath -替换“([[])”,'[$1]' -替换“()”,'$1′

这将使我的 $ServerNalPath 看起来像这样:

[[]”Display=\SERVER01.lab.lcl”]MSWNET:[[]”SMS_SITE=S01″]\SERVER01.lab.lcl

这看起来有点奇怪,但它会让我的查询执行时不会出错。现在我只需循环遍历每个失败的包并将属性“RefreshNow”设置为 True 并调用 Put 方法来应用我的新设置:

Foreach($Package in $FailedPackages)
{
    $Query = "Select * From SMS_DistributionPoint WHERE SiteCode='$SiteCode' AND ServerNALPath Like '$ServerNALPath' AND PackageID = '$($Package.PackageID)'"
    $DistPointPkg = Get-WmiObject -Namespace "rootSMSSite_$SiteCode" -Query $Query
    Write-Verbose -Message "Refreshing package $($DistPointPkg.PackageID) on $($DistributionPoint.Name)"
    $DistPointPkg.RefreshNow = $true
    [Void]$DistPointPkg.Put()
}

这将告诉 System Center Configuration Manager 现在应该刷新包。

为了您的方便,我已将脚本发布在 TechNet Gallery 上:

http://gallery.technet.microsoft.com/Force-SCCM-Distribution-5c243aee

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯