Sdílet prostřednictvím


Vyjmenovávání WMI

Výčtem se rozumí procházení sadou objektů a případná úprava každého objektu během tohoto procesu. Můžete například vytvořit výčet pomocí sady Win32_DiskDrive objektů a najít konkrétní sériové číslo. Všimněte si, že i když můžete vytvořit výčet libovolného objektu, rozhraní WMI vrátí pouze objekty, ke kterým máte přístup zabezpečení.

Výčet velkých datových sad může vyžadovat velké množství prostředků a snížit výkon. Další informace naleznete v tématu Zlepšení výkonu výčtu. Data můžete také vyžádat pomocí konkrétnějšího dotazu. Další informace najdete v tématu Dotazovánírozhraní WMI .

V tomto tématu jsou popsány následující části:

Enumerace WMI pomocí PowerShellu

Pokud neznáte cestu k objektu pro konkrétní instanci nebo chcete načíst všechny instance pro určitou třídu, použijte Get-WmiObjects názvem třídy v parametru -class. Pokud chcete použít dotaz, můžete použít parametr -query.

Následující postup popisuje, jak vytvořit výčet instancí třídy pomocí PowerShellu.

Vytvoření výčtu instancí třídy pomocí powershellového

  1. Vyjmenujte instance voláním rutiny Get-WmiObject.

    Get-WmiObject vrátí kolekci jednoho nebo více objektů WMI, pomocí kterých můžete vytvořit výčet. Další informace naleznete v tématu Přístup k kolekci.

    Pokud chcete načíst instanci třídy WMI v jiném oboru názvů nebo na jiném počítači, zadejte počítač a obor názvů v parametrech -computer a -namespace. Další informace naleznete v tématu Vytvoření skriptu rozhraní WMI. To funguje jenom v případě, že máte příslušná přístupová oprávnění. Další informace naleznete v tématu Udržování zabezpečení rozhraní WMI a Provádění privilegovaných operací.

  2. Načtěte jakékoli jednotlivé instance, které chcete, pomocí členů kolekce.

Následující příklad kódu načte kolekci v PowerShellu a pak zobrazí vlastnost velikosti pro všechny instance logických jednotek v místním počítači.

$objCol = get-wmiobject -class "Win32_LogicalDisk"

# Or, alternately
#$objCol = get-wmiobject -Query "SELECT * FROM Win32_LogicalDisk"

foreach ($Drive in $objCol)
{
    if ($Drive.size -ne $null)
    { "Drive " + $Drive.deviceID + " contains " + $Drive.size + " bytes" }
    else
    { "Drive " + $Drive.deviceID + " is not available." }
}

Vytváření výčtu WMI pomocí jazyka C# (Microsoft.Management.Infrastructure)

  1. Přidejte odkaz na Microsoft.Management.Infrastructure referenční sestavení. (Toto sestavení se dodává jako součást sady Windows Software Development Kit (SDK) pro Windows 8.)
  2. Přidejte pomocí příkazu do oboru názvů Microsoft.Management.Infrastructure.
    using Microsoft.Management.Infrastructure;
  1. Vytvořte instanci objektu CimSession. Následující fragment kódu používá standardní hodnotu localhost pro metodu CimSession.Create.
    CimSession cimSession = CimSession.Create("localhost");
  1. Volejte metodu CimSession.QueryInstances a předávejte požadovaný obor názvů CIM a WQL, která se má použít. Následující fragment kódu vrátí dvě instance představující dva standardní procesy Windows, kde vlastnost popisovače (představující ID procesu nebo PID) má hodnotu 0 nebo 4.
    IEnumerable<CimInstance> queryInstances =     
      cimSession.QueryInstances(@"root\cimv2", 
                                "WQL", 
                                @"select name from win32_process where handle = 0 or handle = 4");
  1. Projděte vrácené objekty CimInstance.
    foreach (CimInstance cimInstance in enumeratedInstances)
    { 
      Console.WriteLine("Process name: {0}", cimInstance.CimInstanceProperties["Name"].Value);  
    }

Následující vzorový kód vytvoří výčet všech instancí třídy Win32_Process (která představuje aktivní procesy) na místním počítači a vytiskne název každého procesu.

Poznámka

V reálné aplikaci byste definovali jako parametry název počítače ("localhost") a obor názvů CIM ("root\cimv2"). Pro účely jednoduchosti byly v tomto příkladu pevně zakódovány.

 

using System;
using System.Collections.Generic;
using Microsoft.Management.Infrastructure;

public partial class MI
{
    static void PrintCimInstance(CimInstance cimInstance)
    {
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.WriteLine("{0} properties", cimInstance.CimSystemProperties.ClassName);
        Console.ResetColor();

        Console.WriteLine(String.Format("{0,-5}{1,-30}{2,-15}{3,-10}", 
                                        "Key?", "Property", "Type", "Value"));

        foreach (var enumeratedProperty in cimInstance.CimInstanceProperties)
        {
            bool isKey = ((enumeratedProperty.Flags & CimFlags.Key) == CimFlags.Key);

            if (enumeratedProperty.Value != null)
            {
                Console.WriteLine(
                    "{0,-5}{1,-30}{2,-15}{3,-10}",
                    isKey == true ? "Y" : string.Empty,
                    enumeratedProperty.Name,
                    enumeratedProperty.CimType,
                    enumeratedProperty.Value);
            }
        }
        Console.WriteLine();
    }

    public static void QueryInstance(string query)
    {
        try
        {
            CimSession cimSession = CimSession.Create("localhost");

            IEnumerable<CimInstance> queryInstances = 
              cimSession.QueryInstances(@"root\cimv2", "WQL", query);
            foreach (CimInstance cimInstance in queryInstances)
            {
                //Use the current instance. This example prints the instance. 
                PrintCimInstance(cimInstance);
            }
        }
         catch (CimException ex) 
        { 
            // Handle the exception as appropriate.
            // This example prints the message.
            Console.WriteLine(ex.Message); 
        }
    }
}

using System;

namespace MIClientManaged
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Write(&quot;Enter WQL (x = Quit): &quot;);
                string query = Console.ReadLine().ToUpper();
                if (query.CompareTo(&quot;X&quot;) == 0) break;
                MI.QueryInstance(query);
            }
        }
    }
}

Vyjmenování objektů WMI pomocí jazyka C# (System.Management)

Pokud neznáte cestu k objektu pro konkrétní instanci nebo chcete načíst všechny instance pro určitou třídu, použijte objekt ManagementClass k načtení ManagementObjectCollection obsahující všechny instance dané třídy v oboru názvů WMI. Alternativně můžete získat stejnou množinu objektů dotazováním na WMI prostřednictvím ManagementObjectSearcher.

Poznámka

System.Management byl původním oborem názvů .NET používaným pro přístup k rozhraní WMI; rozhraní API v tomto oboru názvů jsou však obecně pomalejší a nejsou tak škálovatelné ve srovnání s jejich modernějšími protějšky v Microsoft.Management.Infrastructure.

 

Následující postup popisuje, jak vytvořit výčet instancí třídy pomocí jazyka C#.

Vytvoření výčtu instancí třídy pomocí jazyka C#

  1. Vytvořte výčet instancí voláním ManagementClass.GetInstances.

    Metoda GetInstances vrátí kolekci nebo sadu objektů, pomocí kterých můžete vytvořit výčet. Další informace naleznete v tématu Přístup k kolekci. Vrácená kolekce je ve skutečnosti ManagementObjectCollection objektu, takže lze volat jakoukoli metodu tohoto objektu.

    Pokud chcete načíst instanci třídy WMI v jiném oboru názvů nebo na jiném počítači, zadejte počítač a obor názvů do parametru cesty . Další informace naleznete v tématu Vytvoření skriptu rozhraní WMI. To funguje jenom v případě, že máte příslušná přístupová oprávnění. Další informace naleznete v tématu Údržba zabezpečení rozhraní WMI a Provádění privilegovaných operací.

  2. Získejte libovolné jednotlivé instance, které chcete, s využitím členů kolekce.

Následující příklad kódu načte kolekci v jazyce C# a pak zobrazí vlastnost velikosti pro všechny instance logických disků na místním počítači.

using System.Management;
...

ManagementClass mc = new ManagementClass("Win32_LogicalDisk");
ManagementObjectCollection objCol = mc.GetInstances();

//or, alternately
//ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
//ManagementObjectCollection objCol = mgmtObjSearcher.Get();

if (objCol.Count != 0)
{
   foreach (ManagementObject Drive in objCol)
   {
      if (Drive["size"] != null)
      {
         Console.WriteLine("Drive {0} contains {1} bytes.", Drive["deviceID"], Drive["size"]);
      }
      else
      {
         Console.WriteLine("Drive {0} is not available.", Drive["deviceID"]);
      }
   }
}
Console.ReadLine();

Výčet úloh WMI pomocí VBScriptu

Pokud neznáte cestu k objektu pro konkrétní instanci nebo chcete načíst všechny instance pro určitou třídu, použijte metodu SWbemServices.InstancesOf k vrácení SWbemObjectSet výčet všech instancí třídy. Případně můžete dotazovat rozhraní WMI prostřednictvím SWbemServices.ExecQuery, abyste získali stejnou sadu objektů.

Následující postup popisuje, jak vytvořit výčet instancí třídy pomocí jazyka VBScript.

Vytvoření výčtu instancí třídy pomocí jazyka VBScript

  1. Vytvořte výčet instancí voláním metody SWbemServices.InstancesOf.

    Metoda InstancesOf vrátí kolekci nebo sadu objektů, pomocí kterých můžete vytvořit výčet. Další informace naleznete v tématu Přístup k kolekci. Vrácená kolekce je ve skutečnosti SWbemObjectSet objektu, takže lze volat jakoukoli metodu tohoto objektu.

    Pokud chcete načíst instanci třídy WMI v jiném oboru názvů nebo na jiném počítači, zadejte počítač a obor názvů v monikeru. Další informace naleznete v tématu Vytvoření skriptu rozhraní WMI. To funguje jenom v případě, že máte příslušná přístupová oprávnění. Další informace naleznete v tématu Zachování zabezpečení WMI a Provádění privilegovaných operací.

  2. Pomocí metod kolekcí načtěte všechny jednotlivé instance, které chcete.

Následující příklad kódu načte objekt SWbemServices a poté spustí metodu InstancesOf, která zobrazuje vlastnost velikost pro všechny instance logických jednotek v místním počítači.

Set objCol = GetObject("WinMgmts:").InstancesOf("Win32_LogicalDisk")
For Each Drive In objCol
    If Not IsNull(Drive.Size) Then    
       WScript.Echo ("Drive " & Drive.deviceid & " contains " & Drive.Size & " bytes")
    Else
       WScript.Echo ("Drive " & Drive.deviceid & " is not available.")
    End If
Next

Výčet WMI pomocí C++

Kromě provádění základního výčtu můžete nastavit několik příznaků a vlastností pro zvýšení výkonu výčtu. Další informace naleznete v tématu Zlepšení výkonu výčtu.

Vytvoření výčtu objektu nastaveného ve službě WMI

  1. Vytvořte rozhraní IEnumWbemClassObject, které popisuje sadu objektů, které chcete vyjmenovat.

    Objekt IEnumWbemClassObject obsahuje seznam popisující sadu objektů WMI. Můžete použít IEnumWbemClassObject metody k vytvoření výčtu dopředu, přeskočení objektů, začít od začátku a zkopírování enumerátoru. Následující tabulka uvádí metody, které slouží k vytvoření výčtu pro různé typy objektů WMI.

    Objekt Metoda
    Třída
    IWbemServices::CreateClassEnum
    [IWbemServices::CreateClassEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createclassenumasync)
    Instance
    IWbemServices::CreateInstanceEnum
    [IWbemServices::CreateInstanceEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createinstanceenumasync)
    Výsledek dotazu
    IWbemServices::ExecQuery
    [IWbemServices::ExecQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execqueryasync)
    Oznámení události
    IWbemServices::ExecNotificationQuery
    [IWbemServices::ExecNotificationQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execnotificationqueryasync)

     

  2. Procházení vráceného výčtu prostřednictvím více volání IEnumWbemClassObject::Next nebo IEnumWbemClassObject::NextAsync.

Další informace naleznete v tématu manipulace s informacemi o třídě a instanci.