我不确定这是否可能,但我正在努力编写 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 类“其中 PatchGroup = x”中提取那些对象列表吗?
答案1
单个 WMI 查询无法解决此问题,默认的“创建设备集合向导”也不行。惰性属性是另一个对象实例的属性和值的列表,我们需要在 VBscript 和 PowerShell 中使用 SwbemServices.ExecQuery() COM 接口,或在 PowerShell 中使用 Get-WmiObject 来提取数据。
我会使用 PowerShell 脚本之类的工具来生成计算机 ResourceID 列表,并使用这些 ID 使用内置 CM cmdlet 创建 DirectRule 集合。每次我打算使用此集合之前,我都会运行该脚本。
参见以下脚本块来获取 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--#
}
}
}