您如何查询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)
要枚举所有命名空间,您必须首先连接到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)