2011-03-16 66 views
5

如何查詢WMI名稱空間?如何查詢WMI命名空間?

所以我知道WMI命名空間,因爲我讀了他們離開,我知道我可以連接到說:

root\cimv2 

我的問題是,如果我不知道什麼名稱空間在那裏,我會怎樣去查詢可用的命名空間?

我只是想要去探索WMI,而不必查找每個名稱空間。

我正在使用WBEMtest,但我會拿東西,.NET,winapi.h,你有什麼。

回答

3

要枚舉所有命名空間,必須首先連接到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 
10

我明白,你有你的答案,但要證明它是PowerShell如何輕鬆搞定命名空間列表:

Get-WMIObject -namespace "root" -class "__Namespace" | Select Name 
1

要列出所有命名空間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屬性值做其他事情。

1

對於Python(安裝了必要的WMI和pyWin32擴展):

import wmi 
c = wmi.WMI (moniker='//./root') 
wql = "SELECT * FROM __NAMESPACE" 

for __NAMESPACE in c.query(wql): 
    print __NAMESPACE.Name 
0

使用Get-CimInstance -Query "SELECT * FROM __NAMESPACE" -Namespace "root"從PowerShell中。

這也適用於Windows服務器納米

0

您可以使用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