您如何查询WMI名称空间?

时间:2011-03-16 22:15:18

标签: wmi wmi-query

如何查询WMI命名空间?

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

root\cimv2

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

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

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

6 个答案:

答案 0 :(得分:13)

我知道您得到了答案,但希望展示PowerShell获取命名空间列表是多么容易:

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

答案 1 :(得分:4)

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

检查这些样本

<强>的Delphi

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

答案 2 :(得分:1)

列出C#中名为 server 的服务器的所有(根)命名空间的所有命名空间Name属性值(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属性值执行其他操作。

答案 3 :(得分:1)

对于Python(安装了必需的WMI和pyWin32扩展):

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

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

答案 4 :(得分:0)

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

这也适用于Windows Nano Server

答案 5 :(得分:0)

您可以使用 VBScript Namespaces获取所有root

以下是示例脚本

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