Как вы запрашиваете пространства имен WMI? - PullRequest
6 голосов
/ 17 марта 2011

Как вы запрашиваете пространства имен WMI?

Итак, я знаю о пространствах имен WMI, потому что я прочитал, что они выходят, и я знаю, что могу подключиться, чтобы сказать:

root\cimv2

У меня вопрос: что если бы я не знал, какие пространства имен были там, как бы я отправил запрос о доступных пространствах имен?

Я просто хочу изучить WMI, и мне не нужно искать каждое пространство имен.

Я использую WBEMtest, но я возьму что угодно, .NET, winapi.h, что у тебя.

Ответы [ 6 ]

14 голосов
/ 19 марта 2011

Я понимаю, что вы получили свой ответ, но хотели показать, как легко в PowerShell получить список пространств имен:

Get-WMIObject -namespace "root" -class "__Namespace" | Select Name
4 голосов
/ 17 марта 2011

Чтобы перечислить все пространства имен, вы должны сначала подключиться к пространству имен 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
1 голос
/ 28 марта 2016

Для Python (с установленными необходимыми расширениями WMI и pyWin32):

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

for __NAMESPACE in c.query(wql):
    print __NAMESPACE.Name
1 голос
/ 14 января 2014

Чтобы получить список всех пространств имен Name значений свойств для всех (корневых) пространств имен для сервера с именем server в 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.

0 голосов
/ 05 декабря 2016

Вы можете использовать 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
0 голосов
/ 18 мая 2016

Используйте Get-CimInstance -Query "SELECT * FROM __NAMESPACE" -Namespace "root" от powershell.

Это также работает для Windows Nano Server

...