Поддерживает ли VBScript самоанализ объектов? - PullRequest
1 голос
/ 06 октября 2011

Я извлекаю результаты из WMI, используя WQL через VBScript.

В примерах цикл For Each используется для итерации результатов, но в каждом примере предполагается, что имена свойств известны.Пример:

Set colInstalledPrinters = objWMIService.ExecQuery ("Select * from Win32_Printer Where Default = True")
For Each objPrinter in colInstalledPrinters
    Wscript.Echo objPrinter.Name
Next

Некоторые из классов WMI имеют очень длинный список свойств, связанных с ними.В качестве дополнительного осложнения нельзя ожидать присутствия некоторых свойств (в соответствии с различными веб-страницами, которые я читал о WMI).Вместо того, чтобы исследовать каждый класс WMI и надеяться, что перечисленные свойства присутствуют, я хотел бы получить список свойств (или столбцов, если я имею в виду SQL / WQL), присутствующих, скажем, для objPrinter или любого другого возвращаемого элемента.

Python - мой обычный язык, но я не могу установить его на целевые машины в этом случае;Я могу выполнить удаленный запрос WMI через Python, но я пытаюсь вызвать локальное событие, поэтому я возвращаюсь к VBScript.Хотя я полагаю, что Powershell мог бы сделать это, я бы не стал изучать его в этот момент.

Итак, поддерживает ли VBScript тот уровень самоанализа, который позволил бы мне перечислить список свойств?Или есть что-то, что я могу сделать, используя схему, на которую я могу ссылаться и проверять в сценарии?

1 Ответ

3 голосов
/ 06 октября 2011

Используйте коллекцию .Properties_ элемента:

Option Explicit

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

Dim objWMIService
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Dim colItems
Set colItems = objWMIService.ExecQuery( _
     "SELECT * FROM Win32_Printer" _
   , "WQL" _
   , wbemFlagReturnImmediately + wbemFlagForwardOnly _
)
Dim objItem
For Each objItem In colItems
    Dim oProp
    For Each oProp In objItem.Properties_
        WScript.Echo oProp.Name, TypeName( oProp.Value ), ToString( oProp.Value )
    Next
    WScript.Echo
Next

Function ToString( vX )
  ToString = "!! work to do !!"
 On Error Resume Next
  ToString = CStr( vX )
 On Error GoTo 0
End Function

Вывод:

...
MimeTypesSupported Null !! work to do !!
Name String Auto HP LaserJet 5 on WINXP2
NaturalLanguagesSupported Null !! work to do !!
Network Boolean False
PaperSizesSupported Variant() !! work to do !!
...

Очевидно, что функция ToString () нуждается в дальнейшей работе.

...