Dela via


Hämtar en WMI-klass

Den första typen av objekt som du kan hämta är en WMI-klass. När du hämtar en WMI-klass hämtar du faktiskt en klassdefinition, som är en lista över egenskaper, kvalificerare och metoder som helt beskriver klassen. En klassdefinition är dock i princip själva klassen.

PowerShell använder en standardfråga för att hämta klassdefinitioner med hjälp av klassen meta_class.

Hämta en klassdefinition i PowerShell

  • Använd Get-WmiObject med en fråga för att hämta meta_class, med WHERE-satsen som innehåller namnet på den klass som du vill hämta.

    Get-WmiObject -query "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'"
    

    Get-WmiObject är den standard-cmdlet som PowerShell använder för att hämta klass- och instansinformation från WMI. Klassen meta_class definierar frågan som en schemafråga. Utan klassen meta_class returnerar den här frågan alla instanser av Win32_LogicalDisk. Mer information om hur du gör frågor om WMI finns i SELECT-sats för schemafrågor.

Den aktuella processen för att hämta en WMI-definition i C# är att använda CIMInstance--klass.

Hämta en klassdefinition i C# (Microsoft.Management.Infrastructure)

  1. Med hjälp av Microsoft.Management.Infrastructure-namnområdet skapar du en CIMInstance--klass med angivet namnområde och klassnamn.

    Den skapade klassen innehåller all klassinformation, men inga instansdata.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. Alternativt kan du, precis som med PowerShell, utföra en fråga med hjälp av taggen meta_class som en del av frågan.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string diskDriveQuery = "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'";
    
    CimSession mySession = CimSession.Create("localhost");
    IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace, "WQL", diskDriveQuery);
    

Precis som med PowerShell använder C# en meta_class fråga för att hämta klassdefinitioner. Alternativt kan du skapa ett ManagementClass- objekt för direkt åtkomst till klassdefinitionen.

Anteckning

System.Management var det ursprungliga .NET-namnområdet som användes för att komma åt WMI. API:erna i det här namnområdet är dock vanligtvis långsammare och skalas inte lika bra i förhållande till deras modernare Microsoft.Management.Infrastructure motsvarigheter.

 

Hämta en klassdefinition i C# (System.Management)

  1. Du kan använda ManagementObjectSearcher med en fråga för att meta_class, med WHERE-satsen som innehåller namnet på den klass du vill hämta.

    using System.Management;
    ...
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'");
    ManagementObjectCollection myDiskCollection = searcher.Get();
    

    ManagementObjectSerarcher är standardklassen .NET använder för att hämta klass- och instansinformation från WMI. ManagementObjectSerarcher.Get returnerar en ManagementObjectCollection- som innehåller schemadefinitionsklassen. Klassen meta_class definierar frågan som en schemafråga. Utan klassen meta_class returnerar den här frågan alla instanser av Win32_LogicalDisk. Mer information om hur du kör frågor mot WMI finns i SELECT-instruktion för schemafrågor.

  2. Du kan också skapa ett nytt ManagementClass- objekt, med namnet som sökväg, för att hämta klassen.

    using System.Management;
    ...
    ManagementClass objInst = new ManagementClass("Win32_LogicalDisk");
    

Du kan hämta en klassdefinition i VBScript på ett liknande sätt som när du hämtar en specifik instans.

Hämta en klassdefinition i VBScript-

  1. Anropa SWbemServices.Get men identifiera inte en specifik instans i objektsökvägen för klassen.

  2. I följande kodexempel hämtas klassdefinitionen för klassen som beskriver logiska enheter på datorn.

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Windows Script Host (WSH) stöder också följande.

    <OBJECT id="myLocator" progid="WbemScripting.SWbemLocator"></OBJECT>
    

    På Active Server Pages (ASP) använder du GetObject- eller CreateObject- i skriptet på serversidan. Mer information finns i Skapa aktiva serversidor för WMI-.

  3. En klass eller instans kan också anges, i vilket fall det returnerade objektet är ett WMI-objekt, till exempel en instans av Win32_LogicalDiski stället för ett tjänstobjekt. Observera att du inte kan använda funktionerna VBScript GetObject för att skapa en instans av det generiska objektet SWbemObject.

  4. På HTML-sidor som körs i Microsoft Internet Explorer (IE) kan GetObject- och CreateObject- misslyckas eftersom WMI-skriptobjekt som ActiveX-kontroller inte är markerade som säkra för skript. Det enda undantaget är objektet SWbemDateTime. Det enda sättet att dessa anrop kan lyckas är när du sänker IE-säkerhetsinställningarna, vilket inte rekommenderas.

När du hämtar en klass i C++, anropar du IWbemServices version av GetObject.

Hämta en klassdefinition i C++

  1. Anropa IWbemServices::GetObject eller IWbemServices::GetObjectAsync metoder för att hämta definitionen av en klass.
  2. En klass kan ha flera klassdefinitioner, vilket vanligtvis sker när du har mer än en klassprovider inläst i ett namnområde. När en klass har flera klassdefinitioner returnerar WMI den första definitionen som identifierats och WBEM_S_DUPLICATE_OBJECTS statuskod.

Eftersom GetObject- returnerar en klassdefinition används den ofta som det första steget för att skapa en instans. Mer information om hur du använder GetObjectfinns i Skapa och deklarera en instans med C++.