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)
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);
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)
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.
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-
Anropa SWbemServices.Get men identifiera inte en specifik instans i objektsökvägen för klassen.
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-.
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.
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++
- Anropa IWbemServices::GetObject eller IWbemServices::GetObjectAsync metoder för att hämta definitionen av en klass.
- 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++.