Создание коллекций SCCM 2007 при помощи скрипта на powershell

Как известно для установки программ нужна коллекция, на которую advetersement и будет назначен. Причем жедательно эту коллекцию создавать, чтоб в нее попали только те компьютеры, на которых программа не установлена. Собственно мне надоело каждый раз делать одно и тоже, в результате чего родился скрипт. Скрипту в качестве параметров передается название программы, строка для отбора и если необходимо родительская коллекция, в которой необходимо создвать коллекцию. В результате создаются 2 коллекции – одна будет содержать компьютреы, на которых требуемая программа установлена, вторая на которых не установлена. Коллекции будут обновляться раз в сутки и автоматически создается Query based правило для автоматического заполнения коллекции.

В дальшейшем предполагается добавить возможно указывать версию программы, а также на выбор создавать только одну коллекцию

$Site = “site name”
$sccmServer = “sccmserver name”

function Create-SCCMCollection($parentCollectionName, $collectionName)
{
$ColClass = [WMIClass]”\\$sccmServer\Root\SMS\Site_$($Site):SMS_Collection”
$shClass = [WMIClass]”\\$sccmServer\Root\SMS\Site_$($Site):SMS_ST_RecurInterval”
$Col = $ColClass.PSBase.CreateInstance()
$Col.Name = $collectionName
$Col.OwnedByThisSite = $True
$Col.Comment = “Collection $collectionName”
$col.RefreshType = 2
$sh = $shClass.PSBase.CreateInstance();
$sh.dayspan = 1
$col.RefreshSchedule = $sh
$Col.psbase
$Col.psbase.Put()
$parentColID = (get-wmiobject -class “SMS_Collection” -namespace “root\sms\site_$($Site)” -computername “solsms” -filter “Name = ‘$parentCollectionName'”).collectionID
$NewCollectionID = (Get-WmiObject -computerName $sccmServer -namespace Root\SMS\Site_$Site -class SMS_Collection | where {$_.Name -eq $collectionName}).CollectionID $RelClass = [WMIClass]”\\$sccmServer\Root\SMS\Site_$($Site):SMS_CollectToSubCollect”
$Rel = $RelClass.PSBase.CreateInstance()
$Rel.ParentCollectionID = $parentColID
$Rel.SubCollectionID = $NewCollectionID
$Rel.psbase
$Rel.psbase.Put()

}

function AddQueryToCollection($collectionName, $query)
{
$host.UI.RawUI.ForegroundColor = “White”
$Method = “AddMembershipRule”
$colClass = get-wmiobject -class “SMS_Collection” -namespace “root\sms\site_$($Site)” -computername $sccmServer -filter “Name = ‘$collectionName'”
$objColRuleDirect = [WmiClass]”\\$sccmServer\root\sms\site_A01:SMS_CollectionRuleQuery”
$objColRuleDirect.psbase.Properties[“LimitToCollectionID”].value = “”
$objColRuleDirect.psbase.Properties[“QueryExpression”].value = $query
$objColRuleDirect.psbase.Properties[“RuleName”].value = “Auto Query Rule” $InParams = $colClass.psbase.GetMethodParameters($Method)
$InParams.collectionRule = $objColRuleDirect
$param = $objColRuleDirect.psbase.getMethodParameters(“ValidateQuery”)
$param.wqlquery = $query
$R = $objColRuleDirect.psbase.invokeMethod(“ValidateQuery”,$param,$null)
if ($R.ReturnValue -eq $True) {
$R = $colClass.psbase.InvokeMethod($Method, $inParams, $Null)
if ($R.ReturnValue -eq 0) {
write-Host “Query sucssesful added” $curObj.ResourceID
}
}
else {
$host.UI.RawUI.ForegroundColor = “Red”
write-Host “Error in query ” $query
$host.UI.RawUI.ForegroundColor = “White”
}
}
If ($args.length -eq 0) {
write-host “Please use command Softname SoftQuery Parent Collection Name”
exit
} $softname = $args[0]
$softquery = $args[1]
$parentcollection = $args[2]
If ($parentcollection.length -eq $null) {
write-host “Use default collections”
Create-SCCMCollection “Corporate Software Collections” $softname” Installed”
Create-SCCMCollection “Corporate Software Installation” $softname” Not Installed”
}
else{
write-host “Use custom collections”
Create-SCCMCollection $parentcollection $softname” Installed”
Create-SCCMCollection $parentcollection $softname” Not Installed”
}

$soft = $softquery
$selectFull = “SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name, SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup, SMS_R_SYSTEM.Client”
$selectShort = “SMS_R_System.ResourceID”
$queryPresentSoft = “select ” + $selectFull + ” from SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName like ‘” + $soft + “‘ and Active = 1 and Obsolete = 0”;
$querycontain = “select ” + $selectShort + ” from SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName like ‘” + $soft + “‘ and Active = 1 and Obsolete = 0”;
$queryNotPresentSoft = “select ” + $selectFull+” from SMS_R_System where ResourceId not in (“+$querycontain+”) and Active = 1 and Obsolete = 0″

AddQueryToCollection $softname” Installed” $queryPresentSoft
AddQueryToCollection $softname” Not Installed” $queryNotPresentSoft
$host.UI.RawUI.ForegroundColor = “Green”