Назад | Перейти на главную страницу

Членство в коллекции устройств SCCM на основе машинной переменной

Я не уверен, что это вполне возможно, но мне трудно написать оператор запроса WQL, который позволил бы мне заполнять коллекции устройств SCCM на основе машинной переменной.

Пример: устройство с именем «TestVM-01» имеет машинную переменную с именем «PatchGroup» со значением «Hour1». Я хотел бы, чтобы коллекция устройств под названием «Hour1» динамически заполняла все устройства с переменной PatchGroup, установленной на Hour1.

Сначала я попытался просто запросить переменные устройства через PowerShell и WMI, поскольку класс SMS_MachineVarible является ленивым свойством SMS_MachineSettings, поэтому вы должны вызывать объекты по их полному пути.

В Powershell / WMI я могу запросить его примерно так:

(([wmi]"\\SCCM-LAB\root\sms\site_001:SMS_Machinesettings.ResourceID=11111111").machinevariables | where name -eq "PatchGroup").value

Если вы запросите SMS_MachineSettings без указания полного пути к объекту, он вернет атрибут MachineVariables как пустой

Сможет ли кто-нибудь сказать мне, как я могу написать WQL для этого, чтобы вытащить этот список объектов из класса SMS_Resource «where PatchGroup = x»?

Ни один WMI-запрос не будет работать с этим, как и стандартный «Мастер создания коллекции устройств». Ленивые свойства - это список свойств и значений других экземпляров объекта, нам нужно использовать COM-интерфейс SwbemServices.ExecQuery () в VBscript и PowerShell или Get-WmiObject в PowerShell для извлечения данных.

Я бы сделал это, используя, например, PowerShell Script, для создания списка идентификаторов ресурсов компьютера и использовал эти идентификаторы для создания коллекции DirectRule с помощью встроенного командлета CM. Каждый раз я буду запускать скрипт перед тем, как использовать эту коллекцию.

См. Ниже блоки скрипта, чтобы получить список ResourceID:

$cmdletLocaltion = 'C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1'
$sitecode = 'P01:'
Import-Module $cmdletLocaltion
cd $sitecode
#-Lines to cleanup all the directcollection membership rules -#
$machineObject = Get-WmiObject -Namespace root\sms\site_p01 -Class sms_machinesettings
Foreach ($machine in $machineObject)
    {
        $Path = $machine.__PATH
        $machine = [wmi]"$path"
        foreach ($varvalue in $machine.MachineVariables)
            {
                if (($varvalue.name -eq 'PatchGroup') -and ($varvalue.Value -eq 'Hour1'))
                    {
                        $machine.ResourceID
                #--line here to add to collection membership--#
                    }
            }    
    }