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:
0 INSTALLED
1 INSTALL_PENDING
2 INSTALL_RETRYING
3 INSTALL_FAILED
4 REMOVAL_PENDING
5 REMOVAL_RETRYING
6 REMOVAL_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 $QueryAma 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.GetWmiObjectCommandSorun ş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