使用COM API在WMI中进行WQL查询会返回SWbemObjectSet。从这里,我们可以使用ItemIndex方法迭代集合中的所有对象,从而产生许多SWbemObject个。它们具有Properties_
属性,返回SWbemPropertySet。
此对象具有Count
属性,但没有ItemIndex
方法,而只有Item
方法,该方法接受要提取的属性的字符串名称。我想迭代所有可用的属性,因此我没有可用的名称。我试过调用ItemIndex
方法,但是(根据文档)它在这个对象上不存在。有许多VBScript文档可以像For Each prop in object.Properties_
这样做,所以我认为这是可行的。
如何找到所有属性?
答案 0 :(得分:7)
首先,ItemIndex
属性仅存在于Microsoft WMI Scripting Library
的某些版本中,您可以在本文中找到有关此主题的更多信息,这是我前一段时间写的
Be careful when you import the Microsoft WMI Scripting Library
(代码使用Delphi但同样适用于使用此库的任何语言)。
现在要遍历SWbemPropertySet
的元素,您必须获取访问_NewEnum
属性的枚举器的实例,该属性提供使用IEnumVARIANT
接口枚举变量集合的方法。这是由vbscript 自动完成的,但在其他语言中,如Delphi或C ++必须手动完成。
试试这个Delphi样本
{$APPTYPE CONSOLE}
uses
SysUtils,
ActiveX,
ComObj,
Variants,
WbemScripting_TLB in 'WbemScripting_TLB.pas';
procedure ShowProperties(const WMINameSpace, WMIClass : string);
var
WMIServices : ISWbemServices;
SWbemObjectSet : ISWbemObjectSet;
SObject : ISWbemObject;
LProperty : ISWbemProperty;
Enum, Enum2 : IEnumVariant;
TempObj, TempObj2: OleVariant;
Value : Cardinal;
SWbemPropertySet: ISWbemPropertySet;
begin
WMIServices := CoSWbemLocator.Create.ConnectServer('.', WMINameSpace,'', '', '', '', 0, nil);
SWbemObjectSet := WMIServices.ExecQuery(Format('Select * FROM %s',[WMIClass]), 'WQL', 0, nil);
Enum := (SWbemObjectSet._NewEnum) as IEnumVariant;
if (Enum.Next(1, TempObj, Value) = S_OK) then
begin
SObject := IUnknown(TempObj) as ISWBemObject;
SWbemPropertySet := SObject.Properties_;
Enum2 := (SWbemPropertySet._NewEnum) as IEnumVariant;
while (Enum2.Next(1, TempObj2, Value) = S_OK) do
begin
LProperty := IUnknown(TempObj2) as ISWbemProperty;
Writeln(LProperty.Name);
TempObj2:=Unassigned;
end;
TempObj:=Unassigned;
end;
end;
begin
try
CoInitialize(nil);
try
ShowProperties('root\cimv2','Win32_BaseBoard');
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
我希望你能将这个样本翻译成Go语言。