2016-06-21 7 views
2

Я все еще немного шаткий, когда имею дело с WMI, но вот сценарий. У моей компании несколько моделей ноутбуков HP, развернутых по всему домену, и нам нужно изменить настройку тега ресурса в BIOS. Этот код работает для всех наших EliteBooks HP:WMI: Как определить InstanceName активного экземпляра?

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\0_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\0_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\1_0. Поэтому изменение строки в правильном экземпляре заставляет ее работать для ZBooks, но ломает ее для EliteBooks. Например:

Set objShare = objWMIService.Get(_ 
    "HPBIOS_BIOSSettingInterface.InstanceName='ACPI\PNP0C14\1_0'") 

я мог бы создать два сценария, один для EliteBooks и один для ZBooks, но так как всегда есть только один экземпляр Active, я предпочел бы создать один сценарий, который получает этот активный экземпляр. Например (не рабочий код, который я хотел работал):

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

Итак, как я могу найти InstanceName Активной HPBIOS_BIOSSettingInterface?

ответ

0

Так может быть, это было слишком просто или, может быть, есть лучший способ сделать это, но вот как я в конечном итоге решить ее:

Я просто повторно в 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 & "'") 

Не уверен, что это самый чистый способ для этого, но он работает.