Udostępnij za pośrednictwem


Pobieranie klasy WMI

Pierwszym typem obiektu, który można pobrać, jest klasa WMI. Podczas pobierania klasy WMI faktycznie pobierasz definicję klasy, która jest listą właściwości, kwalifikatorów i metod, które w pełni opisują klasę. Jednak definicja klasy jest w zasadzie samą klasą.

Program PowerShell używa standardowego zapytania do pobierania definicji klas przy użyciu klasy meta_class.

Aby pobrać definicję klasy w programie PowerShell

  • Użyj Get-WmiObject w celu meta_class, z klauzulą WHERE zawierającą nazwę klasy, które chcesz pobrać.

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

    Get-WmiObject to standardowe polecenie cmdlet programu PowerShell używane do pobierania informacji o klasie i wystąpieniu z WMI. Klasa meta_class definiuje zapytanie jako zapytanie schematu. Bez klasy meta_class i klasy to zapytanie zwróciłoby wszystkie wystąpienia Win32_LogicalDisk. Aby uzyskać więcej informacji na temat wykonywania zapytań w usłudze WMI, zobacz Instrukcję SELECT dla zapytania schematu.

Bieżącym procesem pobierania definicji usługi WMI w języku C# jest użycie klasy CIMInstance.

Aby pobrać definicję klasy w języku C# (Microsoft.Management.Infrastructure)

  1. Korzystając z przestrzeni nazw Microsoft.Management.Infrastructure, utwórz klasę CIMInstance z określoną przestrzenią nazw i nazwą klasy.

    Utworzona klasa będzie zawierać wszystkie informacje o klasie, ale bez danych wystąpienia.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. Alternatywnie, podobnie jak w przypadku programu PowerShell, można również wykonać zapytanie przy użyciu tagu meta_class w ramach zapytania.

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

Podobnie jak w przypadku programu PowerShell, język C# używa zapytania meta_class w celu pobrania definicji klas. Alternatywnie można utworzyć obiekt ManagementClass, aby uzyskać bezpośredni dostęp do definicji klasy.

Notatka

pl-PL: System.Management była oryginalną przestrzenią nazw platformy .NET używaną do uzyskiwania dostępu do usługi WMI; jednak interfejsy API w tej przestrzeni nazw ogólnie działają wolniej i gorzej się skalują w porównaniu z ich bardziej nowoczesnymi Microsoft.Management.Infrastructure odpowiednikami.

 

Aby pobrać definicję klasy w języku C# (System.Management)

  1. Możesz użyć ManagementObjectSearcher za pomocą zapytania do meta_class, z klauzulą WHERE zawierającą nazwę klasy, które chcesz pobrać.

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

    ManagementObjectSerarcher to standardowa klasa .NET używana do pobierania informacji o klasie i wystąpieniu z usługi WMI. ManagementObjectSerarcher.Get zwraca ManagementObjectCollection zawierającą klasę definicji schematu. Klasa meta_class definiuje zapytanie jako zapytanie schematu. Bez klasy meta_class to zapytanie zwróci wszystkie wystąpienia Win32_LogicalDisk. Aby uzyskać więcej informacji na temat wykonywania zapytań w usłudze WMI, zobacz instrukcję SELECT dla zapytań schematu.

  2. Alternatywnie, aby pobrać klasę, utwórz nowy obiekt ManagementClass, używając nazwy jako ścieżki.

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

Definicję klasy w języku VBScript można pobrać w podobny sposób jak określone wystąpienie.

Aby pobrać definicję klasy w języku VBScript

  1. Wywołaj metodę SWbemServices.Get, ale nie identyfikuj określonego wystąpienia w ścieżce pliku obiektu dla tej klasy.

  2. Poniższy przykład kodu pobiera definicję klasy dla klasy, która opisuje dyski logiczne na komputerze.

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Host skryptów systemu Windows (WSH) obsługuje również następujące elementy.

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

    Na stronach Active Server Pages (ASP) użyj GetObject lub CreateObject w skrypcie po stronie serwera. Aby uzyskać więcej informacji, zobacz Tworzenie aktywnych stron serwera dla WMI.

  3. Można również określić klasę lub wystąpienie, w którym przypadku zwrócony obiekt jest obiektem WMI, na przykład wystąpieniem Win32_LogicalDisk, a nie obiektem usług. Pamiętaj, że nie można użyć funkcji VBScript GetObject do utworzenia wystąpienia obiektu ogólnego SWbemObject.

  4. Na stronach HTML działających w programie Microsoft Internet Explorer (IE) GetObject i CreateObject mogą zakończyć się niepowodzeniem, ponieważ obiekty skryptowe WMI, takie jak kontrolki ActiveX, nie są oznakowane jako bezpieczne do skryptowania. Jednym wyjątkiem jest obiekt SWbemDateTime. Jedynym sposobem, w jaki te wywołania mogą zakończyć się powodzeniem, jest obniżenie ustawień zabezpieczeń programu IE, co nie jest zalecane.

Podczas pobierania klasy w języku C++ wywołaj IWbemServices wersji GetObject.

Aby pobrać definicję klasy w języku C++

  1. Wywołaj metody IWbemServices::GetObject lub IWbemServices::GetObjectAsync, aby pobrać definicję klasy.
  2. Jedna klasa może mieć wiele definicji klas, co zwykle występuje, gdy masz więcej niż jednego dostawcę klas załadowanego do jednej przestrzeni nazw. Gdy klasa ma wiele definicji klas, usługa WMI zwraca pierwszą odnalezioną definicję i kod stanu WBEM_S_DUPLICATE_OBJECTS.

Ponieważ GetObject zwraca definicję klasy, jest ona często używana jako pierwszy krok podczas tworzenia wystąpienia. Aby uzyskać więcej informacji na temat używania GetObject, zobacz Tworzenie i deklarowanie wystąpienia przy użyciujęzyka C++.