Вопрос или проблема
Я не уверен, возможно ли это, но у меня проблемы с написанием WQL-запроса, который позволил бы мне наполнять коллекции устройств SCCM на основе переменной машины.
Пример:
У устройства с именем “TestVM-01” есть переменная машины с именем “PatchGroup” и значением “Hour1”.
Я хотел бы, чтобы коллекция устройств с названием “Hour1” динамически заполнялась любыми устройствами, у которых переменная PatchGroup установлена в Hour1.
Сначала у меня возникли трудности с запросом переменных устройств через PowerShell и WMI, поскольку класс SMS_MachineVariable является ленивым свойством 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 “где PatchGroup = x”?
Один WMI-запрос не сработает в этом случае, как и стандартный “Магистр создания коллекции устройств”. Ленивые свойства – это список свойств и значений других экземпляров объектов, нам нужно использовать интерфейс COM SwbemServices.ExecQuery() в VBscript и PowerShell, или Get-WmiObject в PowerShell для извлечения данных.
Я бы сделал это, например, с помощью скрипта PowerShell, чтобы сгенерировать список ResourceID компьютеров и использовать эти ID для создания коллекции DirectRule с использованием встроенной команды CM. Каждый раз, когда я буду запускать скрипт, перед тем как использовать эту коллекцию.
Смотрите ниже блоки скриптов для получения списка ResourceID:
$cmdletLocaltion = 'C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1'
$sitecode="P01:"
Import-Module $cmdletLocaltion
cd $sitecode
#-Строки для очистки всех правил членства прямой коллекции-#
$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
#--строка здесь для добавления в членство коллекции--#
}
}
}
Ответ или решение
Членство в коллекции устройств SCCM на основе переменных машины
Вопрос, стоящий перед вами, касается использования переменных машин для динамического формирования коллекции устройств в SCCM (System Center Configuration Manager). Действительно, SCCM предоставляет мощные возможности для управления устройствами, однако работа с переменными машин может оказаться непростой задачей, особенно когда речь идет о записи WQL-запросов.
Проблема и решение
Вашей целью является создание динамической коллекции устройств, основанной на значении переменной "PatchGroup", которая должна включать все машины, имеющие эту переменную с определённым значением, например "Hour1".
К сожалению, выполнение прямого WQL-запроса для извлечения данных из SMS_MachineVariables
невозможно из-за того, что это свойство является «ленивым» и требует специального подхода к его извлечению. На практике это означает, что вы должны использовать PowerShell или аналогичный инструмент для извлечения нужной информации.
Использование PowerShell для создания коллекции
Вы можете воспользоваться PowerShell для извлечения идентификаторов ресурсов (ResourceID) машин, у которых переменная "PatchGroup" установлена в "Hour1". После сбора этих идентификаторов, вы сможете создать коллекцию, используя соответствующие cmdlet SCCM.
Вот скрипт, который помогает достичь этой цели:
$cmdletLocaltion = 'C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1'
$sitecode="P01:"
Import-Module $cmdletLocaltion
cd $sitecode
# Очистка всех правил членства прямой коллекции
$machineObject = Get-WmiObject -Namespace root\sms\site_p01 -Class sms_machinesettings
$resourceIDs = @()
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')) {
$resourceIDs += $machine.ResourceID
}
}
}
# Здесь можно добавить код для создания коллекции на основе $resourceIDs.
# Например: New-CMDeviceCollection -Name "Hour1" -LimitingCollectionID "XYZ" -DirectMembershipRule $resourceIDs
Объяснение скрипта
- Импорт Модуля SCCM: Для начала скрипт импортирует необходимые модули SCCM.
- Сбор данных: Затем он получает все объекты класса
SMS_MachineSettings
, после чего проходит по каждому объекту и проверяет наличие переменной "PatchGroup" с нужным значением. - Сбор ResourceID: Если условие выполняется, идентификаторы ресурсов добавляются в массив
$resourceIDs
. - Создание коллекции: На основе полученных идентификаторов ресурсов вы можете создать новую коллекцию, используя командлет SCCM, который подходит для этой задачи.
Заключение
Динамическое управление коллекциями устройств в SCCM на основе переменных машин требует глубокого понимания как WMI, так и PowerShell. Тем не менее, следуя приведённому решению, вы сможете автоматически формировать коллекции в зависимости от значений машинных переменных. Это не только упрощает управление устройствами, но и делает его более эффективным и адаптированным к вашей инфраструктуре.