Megosztás a következőn keresztül:


WMI számbavétele

Az enumerálás az objektumok egy csoportján való áthaladás és az egyes objektumok módosításának művelete. Számba vehet például Win32_DiskDrive objektumokat, hogy megkeressen egy adott sorozatszámot. Vegye figyelembe, hogy bár bármilyen objektumot számba vehet, a WMI csak azokat az objektumokat adja vissza, amelyekhez biztonsági hozzáféréssel rendelkezik.

A nagy adathalmazok számbavétele nagy mennyiségű erőforrást igényelhet, és csökkentheti a teljesítményt. További információ: Enumerálási teljesítmény javítása. Egy konkrétabb lekérdezéssel is kérhet adatokat. További információ: WMI-lekérdezése.

A következő szakaszokat tárgyaljuk ebben a témakörben:

WMI számbavétele a PowerShell használatával

Ha nem ismeri egy adott példány objektumútvonalát, vagy egy adott osztály összes példányát le szeretné kérni, használja Get-WmiObject, az osztály nevével a -class paraméterben. Ha lekérdezést szeretne használni, használhatja a -query paramétert.

Az alábbi eljárás azt ismerteti, hogyan lehet számba adni egy osztály példányait a PowerShell használatával.

Osztály példányainak számbavétele a PowerShell-

  1. A példányok számbavétele Get-WmiObject parancsmag meghívásával.

    Get-WmiObject egy vagy több WMI-objektum gyűjteményét adja vissza, amelyen keresztül számba vehet. A gyűjtemény eléréséről további információkért lásd: .

    Ha egy WMI-osztálypéldányt egy másik névtérben vagy másik számítógépen szeretne lekérni, adja meg a számítógépet és a névteret a -computer és -namespace paraméterekben. További információ: WMI-szkript létrehozása. Ez csak akkor működik, ha rendelkezik a megfelelő hozzáférési jogosultságokkal. További információ: lásd A WMI biztonság fenntartása és A kiemelt műveletek végrehajtása.

  2. Szerezze be a gyűjtemény elemeiből az egyéni példányokat, amelyeket kíván.

Az alábbi példakód lekéri a PowerShell-gyűjteményt, majd megjeleníti a mérettulajdonságot a helyi számítógépen található logikai meghajtók összes példányához.

$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." }
}

WMI számbavétele C# használatával (Microsoft.Management.Infrastructure)

  1. Adjon hozzá egy hivatkozást a Microsoft.Management.Infrastructure referencia-szerelvényhez. (Ez a szerelvény a Windows 8-hoz készült Windows Szoftverfejlesztői Készlet (SDK) részeként kerül kiszállításra.)
  2. Adjon hozzá egy utasítást a névtérhez a Microsoft.Management.Infrastructure használatával.
    using Microsoft.Management.Infrastructure;
  1. CimSession objektum példányosítása. Az alábbi kódrészlet a standard "localhost" értéket használja a CimSession.Create metódushoz.
    CimSession cimSession = CimSession.Create("localhost");
  1. Hívja meg a CimSession.QueryInstances metódust, amely átadja a használni kívánt CIM-névteret és WQL-t. Az alábbi kódrészlet két olyan példányt ad vissza, amelyek két szabványos Windows-folyamatot képviselnek, ahol a leíró tulajdonság (amely egy folyamatazonosítót vagy EGY PID-t jelöl) értéke 0 vagy 4.
    IEnumerable<CimInstance> queryInstances =     
      cimSession.QueryInstances(@"root\cimv2", 
                                "WQL", 
                                @"select name from win32_process where handle = 0 or handle = 4");
  1. Ciklus a visszaadott CimInstance objektumokon.
    foreach (CimInstance cimInstance in enumeratedInstances)
    { 
      Console.WriteLine("Process name: {0}", cimInstance.CimInstanceProperties["Name"].Value);  
    }

Az alábbi kódminta felsorolja a Win32_Process osztály összes példányát (amely az aktív folyamatokat jelöli) a helyi gépen, és kinyomtatja az egyes folyamatok nevét.

Jegyzet

Egy valós alkalmazásban paraméterként definiálná a számítógép nevét ("localhost") és a CIM-névteret ("root\cimv2"). Az egyszerűség kedvéért ezeket ebben a példában rögzítettük.

 

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);
            }
        }
    }
}

WMI számbavétele C# használatával (System.Management)

Ha nem ismeri egy adott példány objektumútvonalát, vagy egy adott osztály összes példányát le szeretné kérni, a ManagementClass objektummal lekérhet egy ManagementObjectCollection, amely egy adott osztály összes példányát tartalmazza a WMI-névtérben. Alternatívaként lekérdezheti a WMI-t egy ManagementObjectSearcher segítségével, hogy ugyanazt az objektumkészletet szerezze be.

Jegyzet

System.Management a WMI eléréséhez használt eredeti .NET-névtér volt; azonban a névtér API-jai általában lassabbak, és nem méreteznek olyan jól a modernebb Microsoft.Management.Infrastructure megfelelőikhez képest.

 

Az alábbi eljárás azt ismerteti, hogyan lehet számba adni egy osztály példányait a C# használatával.

Az osztály példányainak felsorolása C# használatával

  1. A példányok számbavétele ManagementClass.GetInstanceshívásával.

    A GetInstances metódus olyan objektumok gyűjteményét vagy készletét adja vissza, amelyeken keresztül számba vehet. További információ: Gyűjteményelérése. A visszaadott gyűjtemény valójában egy ManagementObjectCollection objektum, így az objektum bármely metódusa meghívható.

    Ha egy WMI-osztálypéldányt egy másik névtérben vagy egy másik számítógépen szeretne lekérni, adja meg a számítógépet és a névteret a elérési út paraméterben. További információ: WMI-szkript létrehozása. Ez csak akkor működik, ha rendelkezik a megfelelő hozzáférési jogosultságokkal. További információért lásd: WMI biztonság fenntartása és jogosult műveletek végrehajtása.

  2. Érje el bármely egyedi elemet a gyűjtemény tagjai révén.

Az alábbi példakód egy C#-gyűjteményt kér le, majd megjeleníti a mérettulajdonságot a helyi számítógépen található logikai meghajtók összes példányához.

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();

WMI számbavétele VBScript használatával

Ha nem ismeri egy adott példány objektumútvonalát, vagy egy adott osztály összes példányát le szeretné kérni, használja az SWbemServices.InstancesOf metódust egy SWbemObjectSet osztály összes példányának számbavételéhez. Másik lehetőségként lekérdezheti a WMI-t SWbemServices.ExecQuery, hogy ugyanazt az objektumkészletet szerezze be.

Az alábbi eljárás azt ismerteti, hogyan lehet számba adni egy osztály példányait a VBScript használatával.

Osztály példányainak számbavétele VBScript-

  1. A példányok számbavétele az SWbemServices.InstancesOf metódus hívásával.

    A InstancesOf metódus olyan objektumok gyűjteményét vagy készletét adja vissza, amelyeken keresztül számba vehet. További információért lásd: A gyűjtemény elérése. A visszaadott gyűjtemény valójában egy SWbemObjectSet objektum, így az objektum bármely metódusa meghívható.

    Ha egy WMI-osztálypéldányt szeretne lekérni egy másik névtérben vagy egy másik számítógépen, adja meg a számítógépet és a névteret a monikerben. További információ: WMI-szkript létrehozása. Ez csak akkor működik, ha rendelkezik a megfelelő hozzáférési jogosultságokkal. További információ: lásd: a WMI biztonságának fenntartása és a kiemelt műveletek végrehajtása.

  2. Használja a gyűjtemények metódusait bármely egyedi példány lekéréséhez.

Az alábbi példakód egy SWbemServices objektumot kér le, majd végrehajtja a InstancesOf metódust a helyi számítógépen található logikai meghajtók összes példányának mérettulajdonságának megjelenítéséhez.

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

WMI számbavétele C++ használatával

Az egyszerű számbavétel mellett több jelölőt és tulajdonságot is beállíthat az enumerálás teljesítményének növelése érdekében. További információ: Enumerálási teljesítmény javítása.

A WMI objektumkészletének felsorolása

  1. Hozzon létre egy IEnumWbemClassObject felületet, amely leírja a számba venni kívánt objektumok készletét.

    Az IEnumWbemClassObject objektum egy WMI-objektumkészletet leíró listát tartalmaz. Az IEnumWbemClassObject metódusokkal számba vehet előre, kihagyhat objektumokat, kezdheti az elején, és másolhatja az enumerátort. Az alábbi táblázat felsorolja a különböző TÍPUSÚ WMI-objektumok enumerátorainak létrehozásához használt metódusokat.

    Tárgy Módszer
    Osztály
    IWbemServices::CreateClassEnum
    [IWbemServices::CreateClassEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createclassenumasync)
    Példány
    IWbemServices::CreateInstanceEnum
    [IWbemServices::CreateInstanceEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createinstanceenumasync)
    Lekérdezés eredménye
    IWbemServices::ExecQuery
    [IWbemServices::ExecQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execqueryasync)
    Eseményértesítés
    IWbemServices::ExecNotificationQuery
    [IWbemServices::ExecNotificationQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execnotificationqueryasync)

     

  2. Az IEnumWbemClassObject::Nextvagy IEnumWbemClassObject::NextAsyncmeghívásával lépkedjen át a visszaadott enumeráláson.

További információ: Osztály- és példányinformációk módosítása.