如何查詢WMI名稱空間?如何查詢WMI命名空間?
所以我知道WMI命名空間,因爲我讀了他們離開,我知道我可以連接到說:
root\cimv2
我的問題是,如果我不知道什麼名稱空間在那裏,我會怎樣去查詢可用的命名空間?
我只是想要去探索WMI,而不必查找每個名稱空間。
我正在使用WBEMtest,但我會拿東西,.NET,winapi.h,你有什麼。
如何查詢WMI名稱空間?如何查詢WMI命名空間?
所以我知道WMI命名空間,因爲我讀了他們離開,我知道我可以連接到說:
root\cimv2
我的問題是,如果我不知道什麼名稱空間在那裏,我會怎樣去查詢可用的命名空間?
我只是想要去探索WMI,而不必查找每個名稱空間。
我正在使用WBEMtest,但我會拿東西,.NET,winapi.h,你有什麼。
要枚舉所有命名空間,必須首先連接到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;
VBSCRIPT
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
我明白,你有你的答案,但要證明它是PowerShell如何輕鬆搞定命名空間列表:
Get-WMIObject -namespace "root" -class "__Namespace" | Select Name
要列出所有命名空間Name
屬性值對所有(根)命名空間爲服務器在C#中指定的服務器(在LINQPad):
ManagementClass nsClass =
new ManagementClass(
new ManagementScope(@"\\server\root"),
new ManagementPath("__namespace"),
null);
foreach(ManagementObject ns in nsClass.GetInstances())
{
ns["Name"].Dump();
}
注意,Dump
方法只是輸出值;如果你不使用LINQPad,你會想要使用Name
屬性值做其他事情。
對於Python(安裝了必要的WMI和pyWin32擴展):
import wmi
c = wmi.WMI (moniker='//./root')
wql = "SELECT * FROM __NAMESPACE"
for __NAMESPACE in c.query(wql):
print __NAMESPACE.Name
使用Get-CimInstance -Query "SELECT * FROM __NAMESPACE" -Namespace "root"
從PowerShell中。
這也適用於Windows服務器納米
您可以使用VBScript的以從root
得到所有Namespaces
。
下面是示例腳本
On Error Resume Next
strComputer = "."
Wscript.Echo "-----------------------------------"
Wscript.Echo "Namespaces"
Wscript.Echo "-----------------------------------"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root")
Set colItems = objWMIService.ExecQuery(_
"SELECT * FROM __NAMESPACE",,48)
For Each objItem in colItems
Wscript.Echo "Name: " & objItem.Name
Next
預期輸出
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.
-----------------------------------
Namespaces
-----------------------------------
Name: subscription
Name: DEFAULT
Name: MicrosoftWmiNet
Name: CIMV2
Name: Cli
Name: nap
Name: MicrosoftIISv2
Name: SECURITY
Name: SecurityCenter2
Name: RSOP
Name: WebAdministration
Name: WMI
Name: OpenHardwareMonitor
Name: directory
Name: Policy
Name: Interop
Name: ServiceModel
Name: SecurityCenter
Name: Microsoft
Name: aspnet