SCCM Dağıtım Noktasını başarısız paketleri yenilemeye zorla


System Center Configuration Manager'daki bir Dağıtım Noktasında paketlerde hata oluştuysa bunun muhtemelen bir nedeni vardır ve paketleri yeniden göndermek sorun için doğru çözüm olmayabilir.

Ancak başarısız olan tüm paketleri bir dağıtım noktasına yeniden göndermem gerekiyordu ve GUI'de gezinecek havamda değildim, bu yüzden MSDN'de listelenen WMI sınıflarını araştırdım: http://msdn.microsoft.com/en-us/ kütüphane/hh949540.aspx

Öncelikle aradığım şey belli bir dağıtım noktasındaki paketler. Bunlar burada belgelenen SMS_PackageStatusDistPointsSummarizer sınıfında listelenmiştir: http://msdn.microsoft.com/en-us/library/hh949126.aspx

Sınıfın, aşağıdaki durumların mevcut olduğu Durum adında bir Özelliği vardır:

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

Yeni başlayanlar için, Durum 2 veya 3 olduktan sonra paketleri filtreledim ancak Dağıtım Noktasının adını içeren belirgin bir özellik yok, yalnızca ServerNALPath özelliği var.

MSDN'de biraz daha araştırma yaptıktan sonra, bir dağıtım noktasının Adını ve ServerNALPath'ı almak için kullanılabilecek SMS_DistributionPointInfo WMI sınıfını buldum. KAZANÇ!

Yeni başlayanlar için Dağıtım Noktası bilgisini alın:

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

İlk satırda, WQL'de "%" ve regex benzeri sözdizimini kullanarak joker karakterleri destekleyen 'Beğen' operatörünü kullanıyorum (daha fazlası gelecek).

İkinci satırda sonucu bir dizide döndürmek için bir numara kullanıyorum, @() tamamen bununla ilgili. Bu şekilde, sorgu yalnızca bir öğe döndürse bile $DistributionPoint'te Count özelliğini elde ederim.

Daha sonra bu DağıtımPoint'te başarısız olan veya yeniden denenen tüm paketleri bulmam gerekiyor. İlk önce şöyle bir şey denedim:

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

Ama durun, bu bana şu hatayı bildiriyor:

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

Sorun şu ki, ServerNALPath, WQL'e parantezler arasındaki karakterlerden birini aramasını söyleyen ve istediğimi bulamayan "[]" parantezlerini içeriyor. Bunun çözümü, [-karakteri şu şekilde parantezlerle çevrelemektir: "[[]" WQL'e, yalnızca bir karakter olan "[" karakterlerinden herhangi birini aramasını söyler. Açılış parantezi WQL tarafından yorumlanmayacağından, kapanış parantezi “]” de dikkate alınmayacaktır. Bir sonraki sorun, ters eğik çizginin " ", WQL'e bir sonraki karakterin özel bir karakter olarak değil, kelimenin tam anlamıyla yorumlanması gerektiğini söyleyen bir kaçış karakteri olmasıdır; bu, \'nin yalnızca 'ye çevrileceği anlamına gelir. Bunu çözmek için ayrıca her birinden bir .

Bu işlemlerin her ikisi de PowerShell'de $ServerNalPath'teki değiştirme işleci kullanılarak kolayca yapılabilir:

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

Bu benim $ServerNalPath'imin şöyle görünmesini sağlayacak:

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

Bu biraz garip görünüyor, ancak sorgumun hatasız yürütülmesini sağlayacak. Şimdi başarısız olan paketlerin her biri arasında döngü yapmam ve "RefreshNow" özelliğini True olarak ayarlamam ve yeni ayarımı uygulamak için Put yöntemini çağırmam gerekiyor:

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

Bu, System Center Configuration Manager'a paketlerin şimdi yenilenmesi gerektiğini söyleyecektir.

Size kolaylık sağlamak için senaryoyu TechNet Galerisinde yayınladım:

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

İlgili makaleler