Sdílet prostřednictvím


Načítání třídy WMI

Prvním typem objektu, který můžete načíst, je třída WMI. Při načítání třídy WMI skutečně načtete definici třídy, což je výpis vlastností, kvalifikátorů a metod, které plně popisují třídu. Definice třídy je však v podstatě samotná třída.

PowerShell pomocí standardního dotazu načítá definice tříd pomocí třídy meta_class.

Načíst definici třídy v PowerShellu

  • Použijte Get-WmiObject s dotazem na meta_class, s klauzulí WHERE obsahující název třídy, kterou chcete načíst.

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

    Get-WmiObject je standardní rutina, která PowerShell používá k načtení informací o třídě a instanci ze služby WMI. Třída meta_class definuje dotaz jako dotaz schématu. Bez třídy meta_class by tento dotaz vrátil všechny instance Win32_LogicalDisk. Další informace o dotazování rozhraní WMI naleznete v tématu PŘÍKAZ SELECT pro schématové dotazy.

Aktuálním procesem načítání definice rozhraní WMI v jazyce C# je použití CIMInstance třídy.

Načtení definice třídy v jazyce C# (Microsoft.Management.Infrastructure)

  1. Pomocí oboru názvů Microsoft.Management.Infrastructure vytvořte třídu CIMInstance se zadaným oborem názvů a názvem třídy.

    Vytvořená třída bude obsahovat všechny informace o třídě, ale žádná data instance.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. Alternativně, stejně jako v PowerShellu, můžete také provést dotaz pomocí značky meta_class jako součást dotazu.

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

Stejně jako v PowerShellu používá jazyk C# k načtení definic tříd meta_class dotaz. Alternativně můžete vytvořit objekt ManagementClass pro přímý přístup k definici třídy.

Poznámka

System.Management byl tím původním .NET jmenným prostorem používaným pro přístup k WMI; rozhraní API v tomto jmenném prostoru jsou však obecně pomalejší a neškálují se tak dobře ve srovnání s jejich modernějšími protějšky Microsoft.Management.Infrastructure.

 

Načtení definice třídy v jazyce C# (System.Management)

  1. Můžete použít ManagementObjectSearcher s dotazem na meta_class, s klauzulí WHERE obsahující název třídy, kterou chcete načíst.

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

    ManagementObjectSerarcher je standardní třída .NET, která používá k načtení informací o třídě a instanci ze služby WMI. ManagementObjectSearcher.Get vrátí ManagementObjectCollection, která obsahuje třídu definice schématu. Třída meta_class definuje dotaz jako dotaz schématu. Bez třídy meta_class by tento dotaz vrátil všechny instance Win32_LogicalDisk. Další informace o dotazování rozhraní WMI naleznete v tématu PŘÍKAZ SELECT pro dotazy schématu.

  2. Případně vytvořte nový objekt ManagementClass, jehož název bude sloužit jako cesta, k načtení třídy.

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

Definici třídy můžete v jazyce VBScript načíst podobným způsobem jako načtení konkrétní instance.

Načtení definice třídy v VBScriptu

  1. Při volání SWbemServices.Get neidentifikujte konkrétní instanci v cestě objektu pro třídu.

  2. Následující příklad kódu načte definici třídy, která popisuje logické jednotky v počítači.

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Windows Script Host (WSH) také podporuje následující.

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

    Na webu Active Server Pages (ASP) použijte GetObject nebo CreateObject ve skriptu na straně serveru. Další informace naleznete v tématu Vytváření stránek aktivního serveru pro rozhraní WMI.

  3. Lze také zadat třídu nebo instanci, v takovém případě vrácený objekt je objekt WMI, například instance Win32_LogicalDisk, místo služby objektu. Všimněte si, že nelze použít VBScript GetObject funkce k vytvoření instance obecného objektu SWbemObject.

  4. Na stránkách HTML spuštěných v aplikaci Microsoft Internet Explorer (IE) GetObject a CreateObject může selhat, protože skriptovací objekty rozhraní WMI, jako jsou ovládací prvky ActiveX, nejsou označené jako bezpečné pro skriptování. Jedinou výjimkou je objekt SWbemDateTime. Jediným způsobem, jak tato volání mohou být úspěšná, je, když snížíte nastavení zabezpečení IE, což se nedoporučuje.

Při načítání třídy v jazyce C++ zavolejte IWbemServices verzi GetObject.

Načtení definice třídy v jazyka C++

  1. Chcete-li načíst definici třídy, volejte metody IWbemServices::GetObject nebo IWbemServices::GetObjectAsync.
  2. Jedna třída může mít více definic tříd, což se obvykle stává, když máte do jednoho oboru názvů načtených více než jeden zprostředkovatel třídy. Pokud má třída více definic tříd, vrátí rozhraní WMI první zjištěnou definici a stavový kód WBEM_S_DUPLICATE_OBJECTS.

Protože GetObject vrací definici třídy, obvykle se používá jako první krok při vytváření instance. Další informace o použití GetObjectnaleznete v tématu Vytváření a deklarování instance pomocíjazyka C++ .