您如何查询WMI名称空间?

Mat*_*att 7 wmi wmi-query

您如何查询WMI名称空间?

所以我知道WMI命名空间,因为我读到它们退出了,我知道我可以连接说:

root\cimv2
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我不知道那里有什么命名空间,我将如何查询可用的命名空间?

我只是想探索WMI而不必查找每个命名空间.

我正在使用WBEMtest,但我会接受任何东西,.NET,winapi.h,你有什么.

rav*_*nth 14

我知道你得到了答案,但想表明在PowerShell中获取命名空间列表是多么容易:

Get-WMIObject -namespace "root" -class "__Namespace" | Select Name
Run Code Online (Sandbox Code Playgroud)


RRU*_*RUZ 4

要枚举所有命名空间,您必须首先连接到root命名空间,查询所有__NAMESPACE实例,然后为每个实例递归地重复此过程。

检查这些样本

德尔福

procedure  GetListWMINameSpaces(const RootNameSpace:String;const List :TStrings;ReportException:Boolean=True);//recursive function
var
  objSWbemLocator : OleVariant;
  objWMIService   : OleVariant;
  colItems        : OLEVariant;
  colItem         : OLEVariant;
  oEnum           : IEnumvariant;
  iValue          : LongWord;
  sValue          : string;
begin
 try
  objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  objWMIService   := objSWbemLocator.ConnectServer(wbemLocalhost, RootNameSpace, '', '');
  colItems        := objWMIService.InstancesOf('__NAMESPACE');
  oEnum           := IUnknown(colItems._NewEnum) as IEnumVariant;
  while oEnum.Next(1, colItem, iValue) = 0 do
  begin
    sValue:=VarStrNull(colItem.Name);
    colItem:=Unassigned;
    List.Add(RootNameSpace+'\'+sValue);
    GetListWMINameSpaces(RootNameSpace+'\'+sValue,List);//recursive
  end;
 except
     if ReportException then
     raise;
 end;
end;
Run Code Online (Sandbox Code Playgroud)

脚本语言

strComputer = "."
Call EnumNameSpaces("root")

Sub EnumNameSpaces(strNameSpace)
    WScript.Echo strNameSpace
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & _
        "\" & strNameSpace)
    Set colNameSpaces = objWMIService.InstancesOf("__NAMESPACE")
    For Each objNameSpace In colNameSpaces
        Call EnumNameSpaces(strNameSpace & "\" & objNameSpace.Name)
    Next
End Sub
Run Code Online (Sandbox Code Playgroud)