WMI:如何确定活动实例的 InstanceName?

WMI: How to determine InstanceName of active instance?

在处理 WMI 时,我仍然有些犹豫,但情况是这样的。我的公司跨域部署了多款 HP 笔记本电脑,我们需要更改 BIOS 中的资产标签设置。此代码适用于我们所有的 HP EliteBooks:

Set objWMIService = objSWbemLocator.ConnectServer( _ 
    strComputer, "root\HP\InstrumentedBIOS")

'We have to search for the exact bios tag name because it varies by model
Set colItems = objWMIService.ExecQuery("SELECT * FROM HPBIOS_BIOSString", , 48)
For Each objItem In colItems
    If InStr(1, objItem.Name, "Asset") Then strName = objItem.Name
Next

' Obtain an instance of the the class using a key property value.
Set objShare = objWMIService.Get( _ 
    "HPBIOS_BIOSSettingInterface.InstanceName='ACPI\PNP0C14[=10=]_0'")

' Obtain an InParameters object specific to the method.
Set objInParam = objShare.Methods("SetBIOSSetting").InParameters.SpawnInstance_()

' Add the input parameters.
objInParam.Properties_.item("Name") = strName
objInParam.Properties_.item("Value") = strAssetTag
objInParam.Properties_.item("Password") = "<utf-16/>" & strPassword

' Execute the method and obtain the return status.
' The OutParameters object in objOutParams is created by the provider.
Set objOutParams = objWMIService.ExecMethod( _
    "HPBIOS_BIOSSettingInterface.InstanceName='ACPI\PNP0C14[=10=]_0'", _
    "SetBIOSSetting", objInParam)

Select Case objOutParams.return
    Case 0
        strReturn = "Success. Asset Tag " & strAssetTag & _
                    " will be configured the next time you reboot " & _
                    strComputer & "."
    Case 1
        strReturn = "1: Not Supported"
    Case 2
        strReturn = "2: Unspecified Error"
    Case 3
        strReturn = "3: Timeout"
    Case 4
        strReturn = "4: Failed"
    Case 5
        strReturn = "5: Invalid Parameter"
    Case 6
        strReturn = "6: Access Denied"
    Case Else
        strReturn = "..."
End Select

问题是在 HP ZBooks 上,InstaneName 是 ACPI\PNP0C14_0。因此,将行更改为正确的实例使其适用于 ZBooks,但对 EliteBooks 无效。例如:

Set objShare = objWMIService.Get( _ 
    "HPBIOS_BIOSSettingInterface.InstanceName='ACPI\PNP0C14_0'")

我可以创建两个脚本,一个用于 EliteBooks,一个用于 ZBooks,但由于始终只有一个 Active 实例,我宁愿创建一个脚本来获取该活动实例。例如(我希望工作的非工作代码):

Set objShare = objWMIService.Get( _ 
    "HPBIOS_BIOSSettingInterface.Active='True'")

那么,我怎样才能找到活动 HPBIOS_BIOSSettingInterfaceInstanceName

也许这太简单了,或者也许有更好的方法,但我最终是这样解决的:

我只是重复使用 colItems 对象来获取实例集合。应该只有一个,但我通过检查 .Active 属性.

来验证我有正确的实例
'We have to search for the exact bios tag name because it varies by model
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM HPBIOS_BIOSString", , 48)
For Each objItem In colItems
    If InStr(1, objItem.Name, "Asset") Then strTagName = objItem.Name
Next

'We have to search for the exact instance name because it varies by model
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM HPBIOS_BIOSSettingInterface", , 48)
For Each objItem In colItems
    If objItem.Active = "True" Then
        strInstanceName = objItem.InstanceName
    End If
Next

' Obtain the active instance.
Set objShare = objWMIService.Get( _
    "HPBIOS_BIOSSettingInterface.InstanceName='" & strInstanceName & "'")

不确定这是否是最干净的方法,但它确实有效。