Com 在SWbemPropertySet对象上迭代

Com 在SWbemPropertySet对象上迭代,com,wmi,Com,Wmi,WMI中使用COM API的WQL查询返回SWbemObjectSet。由此,我们可以使用该方法对集合中的所有对象进行迭代,从而产生许多。它们有一个属性属性,返回一个 此对象有一个Count属性,但没有ItemIndex方法,而只有一个Item方法,该方法获取属性的字符串名称。我想迭代所有可用的属性,因此我没有可用的名称。我尝试调用ItemIndex方法,但(根据文档)此对象上不存在该方法。有许多VBScript文档对object.Properties中的每个道具执行类似于的操作,因此我认为这是

WMI中使用COM API的WQL查询返回SWbemObjectSet。由此,我们可以使用该方法对集合中的所有对象进行迭代,从而产生许多。它们有一个
属性
属性,返回一个

此对象有一个
Count
属性,但没有
ItemIndex
方法,而只有一个
Item
方法,该方法获取属性的字符串名称。我想迭代所有可用的属性,因此我没有可用的名称。我尝试调用
ItemIndex
方法,但(根据文档)此对象上不存在该方法。有许多VBScript文档对object.Properties中的每个道具执行类似于
的操作,因此我认为这是可能的


如何查找所有属性?

首先,
ItemIndex
属性仅存在于
Microsoft WMI脚本库的某些版本中
您可以在我不久前撰写的这篇文章中找到有关此主题的更多信息(代码使用Delphi,但同样适用于使用此库的任何语言)

现在,要迭代的元素,您必须获得访问
\u NewEnum
属性的枚举器的实例,该属性提供了使用接口枚举变量集合的方法。这是自动地由VBScript实现的,但是在其他语言中,如Delphi或C++必须手工完成。p> 试试这个Delphi示例

{$APPTYPE控制台}
使用
SysUtils,
ActiveX,
科莫布,
变体,
“WbemScripting_TLB.pas”中的WbemScripting_TLB;
过程ShowProperties(常量WMINameSpace,WMIClass:string);
变量
WMIServices:ISWbemServices;
SWbemObjectSet:ISWbemObjectSet;
SObject:ISWbemObject;
LProperty:ISWbemProperty;
Enum,Enum2:IEnumVariant;
TempObj,TempObj2:OleVariant;
值:基数;
SWbemPropertySet:ISWbemPropertySet;
开始
WMIServices:=CoSWbemLocator.Create.ConnectServer('.',WMINameSpace,'','','',0,nil);
SWbemObjectSet:=WMIServices.ExecQuery(格式('Select*FROM%s',[WMIClass]),'WQL',0,nil);
枚举:=(SWbemObjectSet.\u NewEnum)作为IEnumVariant;
如果(Enum.Next(1,TempObj,Value)=S_OK),则
开始
SObject:=IUnknown(TempObj)作为ISWBemObject;
SWbemPropertySet:=SObject.Properties\uux;
Enum2:=(SWbemPropertySet.\u NewEnum)作为IEnumVariant;
而(Enum2.Next(1,TempObj2,Value)=S_OK)do
开始
LProperty:=IUnknown(TempObj2)作为ISWbemProperty;
Writeln(LProperty.Name);
TempObj2:=未分配;
结束;
TempObj:=未分配;
结束;
结束;
开始
尝试
共初始化(零);
尝试
ShowProperties('root\cimv2','Win32_基板');
最后
协商初始化;
结束;
除了
关于E:EOleException do
Writeln(格式('EOleException%s%x',[E.Message,E.ErrorCode]);
关于E:Exception-do
Writeln(E.Classname,“:”,E.Message);
结束;
Writeln(“按回车键退出”);
Readln;
结束。

我希望您能将此示例翻译成Go语言。

您使用哪种语言访问WMI?我正在使用。