8

WMI 名前空間を照会するにはどうすればよいですか?

WMI 名前空間が存在することを読んだので、私は WMI 名前空間について知っています。

root\cimv2

私の質問は、そこにある名前空間がわからない場合、利用可能な名前空間を照会するにはどうすればよいでしょうか?

各名前空間を検索する必要がないように、WMI を探索したいだけです。

私は WBEMtest を使用していますが、.NET、winapi.h など何でも使用します。

4

6 に答える 6

15

回答を得たことは理解していますが、PowerShell で名前空間のリストを取得するのがいかに簡単かを示したかったのです。

Get-WMIObject -namespace "root" -class "__Namespace" | Select Name
于 2011-03-19T15:49:56.440 に答える
4

すべての名前空間を列挙するには、最初に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
于 2011-03-16T23:25:13.260 に答える
2

Python の場合 (必要な WMI および pyWin32 拡張機能がインストールされている場合):

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

for __NAMESPACE in c.query(wql):
    print __NAMESPACE.Name
于 2016-03-28T05:29:45.580 に答える
1

C# ( LINQPad内) でserverNameという名前のサーバーのすべての (ルート) 名前空間のすべての名前空間プロパティ値を一覧表示するには:

ManagementClass nsClass =
    new ManagementClass(
        new ManagementScope(@"\\server\root"),
        new ManagementPath("__namespace"),
        null);

foreach(ManagementObject ns in nsClass.GetInstances())
{
    ns["Name"].Dump();
}

このDumpメソッドは値を出力するだけであることに注意してください。NameLINQPad を使用していない場合は、プロパティ値で別のことをしたいと思うでしょう。

于 2014-01-14T16:26:25.987 に答える
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
于 2016-12-05T07:54:18.147 に答える