Delen via


WMI inventariseren

Enumeratie is de handeling van het doorlopen van een set objecten en het mogelijk wijzigen van elk object tijdens het doorlopen. U kunt bijvoorbeeld een reeks Win32_DiskDrive objecten opsommen om een bepaald serienummer te vinden. Hoewel u elk object kunt inventariseren, retourneert WMI alleen objecten waartoe u beveiligingstoegang hebt.

Opsommingen van grote gegevenssets kunnen een grote hoeveelheid resources vereisen en de prestaties verminderen. Zie De inventarisatieprestaties verbeterenvoor meer informatie. U kunt ook gegevens aanvragen met een specifiekere query. Zie Query's uitvoeren op WMI-voor meer informatie.

In dit onderwerp worden de volgende secties besproken:

WMI inventariseren met Behulp van PowerShell

Als u het objectpad voor een specifiek exemplaar niet kent of als u alle exemplaren voor een specifieke klasse wilt ophalen, gebruikt u Get-WmiObject, met de naam van de klasse in de parameter -class. Als u een query wilt gebruiken, kunt u de parameter -query gebruiken.

In de volgende procedure wordt beschreven hoe u de exemplaren van een klasse opsommen met behulp van PowerShell.

De exemplaren van een klasse opsommen met behulp van PowerShell

  1. Inventariseer de exemplaren met een aanroep naar Get-WmiObject cmdlet.

    Get-WmiObject een verzameling van een of meer WMI-objecten retourneert, waarmee u kunt inventariseren. Zie Een verzameling openenvoor meer informatie.

    Als u een WMI-klasse-exemplaar wilt ophalen in een andere naamruimte of op een andere computer, geeft u respectievelijk de computer en naamruimte op in de -computer en -namespace parameters. Zie Een WMI-script makenvoor meer informatie. Dit werkt alleen als u over de juiste toegangsbevoegdheden beschikt. Zie WMI Security- onderhouden en Bevoegde bewerkingen uitvoerenvoor meer informatie.

  2. Haal enkele afzonderlijke exemplaren op die u wilt gebruiken via de leden van de verzameling.

In het volgende codevoorbeeld wordt een PowerShell-verzameling opgehaald en wordt vervolgens de grootte-eigenschap weergegeven voor alle exemplaren van logische stations op de lokale computer.

$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 inventariseren met C# (Microsoft.Management.Infrastructure)

  1. Voeg een verwijzing toe naar de Microsoft.Management.Infrastructure referentieassembly. (Deze assembly wordt geleverd als onderdeel van de Windows Software Development Kit (SDK) voor Windows 8.)
  2. Voeg een toe met behulp van instructie voor de naamruimte Microsoft.Management. Infrastructure.
    using Microsoft.Management.Infrastructure;
  1. Instantieer een CimSession-object. In het volgende codefragment wordt de standaardwaarde localhost gebruikt voor de methode CimSession.Create.
    CimSession cimSession = CimSession.Create("localhost");
  1. Roep de CimSession.QueryInstances aan methode die de gewenste CIM-naamruimte en WQL doorgeeft die moet worden gebruikt. Het volgende codefragment retourneert twee exemplaren die twee standaard Windows-processen vertegenwoordigen, waarbij de handle-eigenschap (die een proces-id of PID vertegenwoordigt) de waarde 0 of 4 heeft.
    IEnumerable<CimInstance> queryInstances =     
      cimSession.QueryInstances(@"root\cimv2", 
                                "WQL", 
                                @"select name from win32_process where handle = 0 or handle = 4");
  1. Loop door de geretourneerde CimInstance objecten.
    foreach (CimInstance cimInstance in enumeratedInstances)
    { 
      Console.WriteLine("Process name: {0}", cimInstance.CimInstanceProperties["Name"].Value);  
    }

In het volgende codevoorbeeld worden alle exemplaren van de Win32_Process-klasse (die actieve processen vertegenwoordigt) op de lokale computer opgesomd en wordt de naam van elk proces afgedrukt.

Notitie

In een echte toepassing definieert u als parameters de computernaam ('localhost') en de CIM-naamruimte ('root\cimv2'). Voor het gemak zijn deze in dit voorbeeld vastgelegd.

 

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("Enter WQL (x = Quit): ");
                string query = Console.ReadLine().ToUpper();
                if (query.CompareTo("X") == 0) break;
                MI.QueryInstance(query);
            }
        }
    }
}

WMI inventariseren met C# (System.Management)

Als u het objectpad voor een specifiek exemplaar niet kent of als u alle exemplaren voor een specifieke klasse wilt ophalen, gebruikt u het ManagementClass-object om een ManagementObjectCollection- op te halen die alle exemplaren van een bepaalde klasse in de WMI-naamruimte bevat. U kunt ook een query uitvoeren op WMI via een ManagementObjectSearcher- om dezelfde set objecten te verkrijgen.

Notitie

System.Management was de oorspronkelijke .NET-naamruimte die wordt gebruikt voor toegang tot WMI; De API's in deze naamruimte zijn over het algemeen echter langzamer en worden niet zo goed geschaald ten opzichte van hun modernere Microsoft.Management.Infrastructure tegenhangers.

 

In de volgende procedure wordt beschreven hoe u de exemplaren van een klasse opsommen met behulp van C#.

De exemplaren van een klasse inventariseren met behulp van C#

  1. Inventariseer de exemplaren met een aanroep naar ManagementClass.GetInstances.

    De methode GetInstances retourneert een verzameling of set objecten waarmee u objecten kunt inventariseren. Zie Een verzameling openenvoor meer informatie. De geretourneerde verzameling is eigenlijk een ManagementObjectCollection--object, dus een van de methoden van dat object kan worden aangeroepen.

    Als u een WMI-klasse-exemplaar wilt ophalen in een andere naamruimte of op een andere computer, geeft u de computer en naamruimte op in het pad parameter. Zie Een WMI-script makenvoor meer informatie. Dit werkt alleen als u over de juiste toegangsbevoegdheden beschikt. Zie WMI Security- onderhouden en Bevoegde bewerkingen uitvoerenvoor meer informatie.

  2. Haal eventuele afzonderlijke exemplaren op die u wenst via de leden van de verzameling.

In het volgende codevoorbeeld wordt een C#-verzameling opgehaald en wordt vervolgens de grootte-eigenschap weergegeven voor alle exemplaren van logische stations op de lokale computer.

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 inventariseren met VBScript

Als u het objectpad voor een specifiek exemplaar niet kent of als u alle exemplaren voor een specifieke klasse wilt ophalen, gebruikt u de methode SWbemServices.InstancesOf om een SWbemObjectSet te retourneren opsomming van alle exemplaren van een klasse. U kunt ook een query uitvoeren op WMI via SWbemServices.ExecQuery- om dezelfde set objecten te verkrijgen.

In de volgende procedure wordt beschreven hoe u de exemplaren van een klasse opsommen met behulp van VBScript.

Om de exemplaren van een klasse op te sommen met behulp van VBScript-

  1. Inventariseer de exemplaren met een aanroep naar de methode SWbemServices.InstancesOf.

    De methode InstancesOf retourneert een verzameling of set objecten waarmee u kunt inventariseren. Zie Een verzameling openenvoor meer informatie. De geretourneerde verzameling is eigenlijk een SWbemObjectSet object, dus een van de methoden van dat object kan worden aangeroepen.

    Als u een WMI-klasse-exemplaar wilt ophalen in een andere naamruimte of op een andere computer, geeft u de computer en naamruimte op in de moniker. Zie Een WMI-script makenvoor meer informatie. Dit werkt alleen als u over de juiste toegangsbevoegdheden beschikt. Zie WMI Security- onderhouden en Bevoegde bewerkingen uitvoerenvoor meer informatie.

  2. Haal eventuele afzonderlijke exemplaren op die u wilt gebruiken met behulp van de verzamelingsmethoden.

In het volgende codevoorbeeld wordt een SWbemServices--object opgehaald en vervolgens de methode InstancesOf uitgevoerd om de size-eigenschap weer te geven voor alle exemplaren van logische schijven op de lokale computer.

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 inventariseren met C++

Naast het uitvoeren van eenvoudige inventarisatie kunt u verschillende vlaggen en eigenschappen instellen om de prestaties van uw opsomming te verbeteren. Zie De inventarisatieprestaties verbeterenvoor meer informatie.

Een object dat is ingesteld in WMI- opsommen

  1. Maak een IEnumWbemClassObject interface waarin de set objecten wordt beschreven die u wilt opsommen.

    Een IEnumWbemClassObject object bevat een lijst met een beschrijving van een set WMI-objecten. U kunt de IEnumWbemClassObject methoden gebruiken om forwards te inventariseren, objecten over te slaan, aan het begin te beginnen en de enumerator te kopiƫren. De volgende tabel bevat de methoden die worden gebruikt voor het maken van opsommingstekens voor verschillende typen WMI-objecten.

    Object Methode
    Klas
    IWbemServices::CreateClassEnum
    [IWbemServices::CreateClassEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createclassenumasync)
    Voorbeeld
    IWbemServices::CreateInstanceEnum
    [IWbemServices::CreateInstanceEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createinstanceenumasync)
    Resultaat van de query
    IWbemServices::ExecQuery
    [IWbemServices::ExecQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execqueryasync)
    Gebeurtenismelding
    IWbemServices::ExecNotificationQuery
    [IWbemServices::ExecNotificationQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execnotificationqueryasync)

     

  2. Blader door de geretourneerde opsomming met behulp van meerdere aanroepen naar IEnumWbemClassObject::Volgende of IEnumWbemClassObject::NextAsync.

Zie voor meer informatie Manipuleren van Klasse- en Instance-informatie.