Tìm kiếm trang web

Buộc Điểm phân phối SCCM làm mới các gói bị lỗi


Nếu Điểm phân phối trong Trình quản lý cấu hình trung tâm hệ thống có các gói bị lỗi thì có thể có nguyên nhân và việc gửi lại các gói có thể không phải là giải pháp phù hợp cho sự cố.

Nhưng tôi có nhu cầu gửi lại tất cả các gói bị lỗi trên một điểm phân phối và tôi không có tâm trạng nhấp chuột vào GUI nên tôi đã điều tra các lớp WMI được liệt kê trên MSDN: http://msdn.microsoft.com/en-us/ thư viện/hh949540.aspx

Trước hết, thứ tôi đang tìm kiếm là các gói trên một điểm phân phối nhất định. Chúng được liệt kê trong lớp SMS_PackageStatusDistPointsSummarizer được ghi lại ở đây: http://msdn.microsoft.com/en-us/library/hh949126.aspx

Lớp này có một Thuộc tính được gọi là Trạng thái với các trạng thái sau:

0INSTALLED
1INSTALL_PENDING
2INSTALL_RETRYING
3INSTALL_FAILED
4REMOVAL_PENDING
5REMOVAL_RETRYING
6REMOVAL_FAILED

Để bắt đầu, tôi đã lọc các gói sau Trạng thái là 2 hoặc 3 nhưng không có thuộc tính rõ ràng nào chứa tên của Điểm phân phối, chỉ có thuộc tính ServerNALPath.

Sau khi tìm hiểu thêm về MSDN, tôi đã tìm thấy lớp WMI SMS_DistributionPointInfo có thể được sử dụng để truy xuất Tên và Đường dẫn máy chủNALPath cho điểm phân phối. THẮNG!

Vì vậy, để bắt đầu, hãy lấy thông tin về Điểm phân phối:

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

Ở hàng đầu tiên, tôi sử dụng toán tử 'Like', trong WQL hỗ trợ ký tự đại diện bằng cách sử dụng cú pháp “%” và giống như biểu thức chính quy (sẽ có thêm thông tin về điều đó).

Ở hàng thứ hai, tôi sử dụng một thủ thuật để trả về kết quả trong một mảng, đó chính là nội dung của @(). Bằng cách này, tôi nhận được thuộc tính Count trên $DistributionPoint ngay cả khi truy vấn chỉ trả về một mục.

Sau đó, tôi cần tìm tất cả các gói bị lỗi hoặc đang thử lại trong DistributionPoint đó. Đầu tiên tôi đã thử một cái gì đó như thế này:

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

Nhưng chờ đã, điều đó mang lại cho tôi một Lỗi cho biết:

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

Vấn đề là ServerNALPath Chứa dấu ngoặc “[] ” yêu cầu WQL tìm kiếm một trong các ký tự giữa các dấu ngoặc và điều đó sẽ không tìm thấy thứ tôi muốn. Giải pháp cho vấn đề này là bao quanh [-char bằng các dấu ngoặc như thế này: “[[] ” yêu cầu WQL tìm kiếm bất kỳ ký tự nào trên các ký tự “[“, chỉ là một ký tự. Vì dấu ngoặc mở sẽ không được WQL diễn giải nên dấu ngoặc đóng “] ” cũng sẽ bị bỏ qua. Vấn đề tiếp theo là dấu gạch chéo ngược “ ” là ký tự thoát cho WQL biết rằng ký tự tiếp theo phải được hiểu theo nghĩa đen chứ không phải là ký tự đặc biệt, nghĩa là\sẽ chỉ dịch sang . Để giải quyết vấn đề này, chúng ta cũng sẽ phải thoát từng cái bằng một .

Cả hai thao tác này đều có thể thực hiện dễ dàng trong PowerShell bằng cách sử dụng toán tử thay thế trên $ServerNalPath:

$ServerNalPath=$DistributionPoint.NALPath - thay thế “([[]) ”,’[$1]’ -replace “() ”,’$1′

Điều này sẽ làm cho $ServerNalPath của tôi trông như thế này:

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

Điều này có vẻ hơi lạ nhưng nó sẽ khiến truy vấn của tôi được thực thi mà không gặp lỗi. Bây giờ tôi chỉ cần lặp qua từng gói bị lỗi và đặt thuộc tính “RefreshNow” thành True và gọi phương thức Put để áp dụng cài đặt mới của mình:

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()
}

Điều này sẽ thông báo cho System Center Configuration Manager rằng các gói cần được làm mới ngay bây giờ.

Để thuận tiện cho bạn, tôi đã đăng tập lệnh trên Thư viện TechNet:

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

Bài viết liên quan