Sdílet prostřednictvím


Přístup k předinstalovaným třídám výkonu služby WMI

Úložiště rozhraní WMI obsahuje předinstalované třídy výkonu pro všechny objekty knihovny výkonu. Například instance nezpracované třídy výkonu dat Win32_PerfRawData_PerfProc_Process představují procesy. Tento objekt výkonu je viditelný v nástroji Sledování systému jako objekt Proces.

Vlastnost PageFaultsPerSec objektu Win32_PerfRawData_PerfProc_Process představuje čítač výkonu chyb stránky za sekundu pro proces. Třídy Win32_PerfFormattedData obsahují hodnoty počítaných dat zobrazené v nástroji System Monitor (Perfmon.exe). Hodnota vlastnosti PageFaultsPerSecWin32_PerfFormattedData_PerfProc_Process je stejná jako při zobrazení v nástroji System Monitor.

Pomocí rozhraní COM API pro rozhraní WMI nebo rozhraní API pro skriptování pro rozhraní WMI přistupovat k datům o výkonu prostřednictvím tříd čítačů výkonu. V obou případech se k získání každého vzorku dat vyžaduje objekt. Další informace a příklady kódu skriptu pro použití aktualizačních procesů a přístupu ke třídám výkonu najdete v tématu Úlohy rozhraní WMI: Sledování výkonu. Další informace najdete v tématu Přístup k datům o výkonu ve skriptu.

Přístup k datům o výkonu z C++

Následující příklad kódu C++ používá poskytovatele čítačů výkonu pro přístup k předdefinovaným vysoce výkonným třídám. Vytvoří objekt aktualizačního modulu a přidá objekt do aktualizačního modulu. Objekt je instance Win32_PerfRawData_PerfProc_Process, která monitoruje výkon konkrétního procesu. Kód čte v objektu procesu pouze jednu vlastnost čítače, vlastnost VirtualBytes. Kód vyžaduje, aby správně zkompiloval následující odkazy a příkazy #include.

#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")

Následující postup ukazuje, jak získat přístup k datům z vysoce výkonného poskytovatele v jazyce C++.

Přistupovat k datům od poskytovatele s vysokým výkonem v C++

  1. Navázat připojení k oboru názvů rozhraní WMI a nastavit zabezpečení rozhraní WMI pomocí volání IWbemLocator::ConnectServer a CoSetProxyBlanket.

    Tento krok je standardní krok pro vytvoření libovolné klientské aplikace rozhraní WMI. Další informace naleznete v tématu Vytvoření aplikace rozhraní WMI pomocíjazyka C++ .

  2. Pomocí CoCreateInstance s CLSID_WbemRefresher vytvořte objekt pro obnovení. Požádejte prostřednictvím metody QueryInterface o rozhraní IWbemConfigureRefresher. Prostřednictvím metody QueryInterface požádejte o rozhraní IWbemRefresher.

    Rozhraní IWbemRefresher je hlavním rozhraním pro objekt WMI Refresher.

    Následující příklad kódu C++ ukazuje, jak načíst IWbemConfigureRefresher.

    IWbemRefresher* pRefresher = NULL;
    
    HRESULT hr = CoCreateInstance(
        CLSID_WbemRefresher,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_IWbemRefresher,
        (void**) &pRefresher);
    
    IWbemConfigureRefresher* pConfig = NULL;
    
    pRefresher->QueryInterface( 
        IID_IWbemConfigureRefresher,
        (void**) &pConfig
      );
    
  3. Přidejte objekt do aktualizačního modulu voláním metody IWbemConfigureRefresher::AddObjectByPath metoda.

    Když přidáte objekt do aktualizačního programu, rozhraní WMI aktualizuje objekt pokaždé, když zavoláte metodu IWbemRefresher::Refresh. Objekt, který přidáte, určí zprostředkovatele pomocí jeho třídních kvalifikátorů.

    Následující příklad kódu C++ ukazuje, jak volat AddObjectByPath.

    IWbemClassObject* pObj = NULL;
    IWbemServices* pNameSpace = NULL;
    
    // Add the instance to be refreshed.
    hr = pConfig->AddObjectByPath(
         pNameSpace,
         L"Win32_PerfRawData_PerfProc_Process.Name=\"WINWORD\"",
         0L,
         NULL,
         &pObj,
         NULL
    );
    if (FAILED(hr))
    {
       cout << "Could not add object. Error code: 0x"
            << hex << hr << endl;
       pNameSpace->Release();
       return hr;
    }
    
  4. Pokud chcete nastavit rychlejší přístup k objektu, připojte se k rozhraní IWbemObjectAccess prostřednictvím QueryInterface v rozhraní IWbemClassObject.

    Následující příklad kódu C++ ukazuje, jak načíst ukazatel na objekt pomocí IWbemObjectAccess místo IWbemClassObject.

        // For quick property retrieval, use IWbemObjectAccess.
        IWbemObjectAccess* pAcc = NULL;
        pObj->QueryInterface( IID_IWbemObjectAccess, (void**) &pAcc );
        // This is not required.
        pObj->Release();
    

    IWbemObjectAccess rozhraní zvyšuje výkon, protože můžete získat přístupy k specifickým vlastnostem čítače a vyžaduje, abyste objekt zamkli a odemkli v rámci kódu, což je operace, kterou IWbemClassObject provádí při každém přístupu k vlastnostem.

  5. Získejte popisovače vlastností, které chcete prozkoumat, pomocí metody IWbemObjectAccess::GetPropertyHandle.

    Popisovače vlastností jsou stejné pro všechny instance třídy, což znamená, že použijte popisovač vlastnosti, který načítáte z konkrétní instance pro všechny instance konkrétní třídy. Můžete také získat popisovač z objektu třídy k načtení hodnot vlastností z instančního objektu.

    Následující příklad kódu C++ ukazuje, jak načíst popisovač vlastnosti.

        // Get a property handle for the VirtualBytes property
        long lVirtualBytesHandle = 0;
        DWORD dwVirtualBytes = 0;
        CIMTYPE variant;
    
        hr = pAcc->GetPropertyHandle(L"VirtualBytes",
             &variant,
             &lVirtualBytesHandle 
        );
        if (FAILED(hr))
        {
           cout << "Could not get property handle. Error code: 0x"
                << hex << hr << endl;
           return hr;
        }
    
  6. Vytvořte programovací smyčku, která provádí následující akce:

    • Aktualizujte objekt pomocí volání IWbemRefresher::Refresh s využitím ukazatele vytvořeného při předchozím volání CoCreateInstance.

      V tomto volání nástroj WMI Refresher aktualizuje objekt klienta pomocí dat, která poskytovatel poskytuje.

    • Podle potřeby proveďte u objektu jakoukoli akci, například načtení názvu vlastnosti, datového typu nebo hodnoty.

      K vlastnosti můžete přistupovat prostřednictvím popisovače vlastnosti získaného dříve. Vzhledem k volání Refresh aktualizuje rozhraní WMI vlastnost při každém procházení smyčky.

Následující příklad jazyka C++ ukazuje, jak používat vysoce výkonné rozhraní API služby WMI.

// Get the local locator object
IWbemServices* pNameSpace = NULL;
IWbemLocator* pWbemLocator = NULL;
CIMTYPE variant;
VARIANT VT;

CoCreateInstance( CLSID_WbemLocator, NULL,
    CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**) &pWbemLocator
);

// Connect to the desired namespace
BSTR bstrNameSpace = SysAllocString( L"\\\\.\\root\\cimv2" );

HRESULT hr = WBEM_S_NO_ERROR;

hr = pWbemLocator->ConnectServer(
     bstrNameSpace,      // Namespace name
     NULL,               // User name
     NULL,               // Password
     NULL,               // Locale
     0L,                 // Security flags
     NULL,               // Authority
     NULL,               // Wbem context
     &pNameSpace         // Namespace
);

if ( SUCCEEDED( hr ) )
{
    // Set namespace security.
    IUnknown* pUnk = NULL;
    pNameSpace->QueryInterface( IID_IUnknown, (void**) &pUnk );

    hr = CoSetProxyBlanket(
         pNameSpace, 
         RPC_C_AUTHN_WINNT, 
         RPC_C_AUTHZ_NONE, 
         NULL, 
         RPC_C_AUTHN_LEVEL_DEFAULT, 
         RPC_C_IMP_LEVEL_IMPERSONATE,
         NULL, 
         EOAC_NONE 
    );
    if (FAILED(hr))
    {
       cout << "Cannot set proxy blanket. Error code: 0x"
            << hex << hr << endl;
       pNameSpace->Release();
       return hr;
    }

    hr = CoSetProxyBlanket(pUnk, 
         RPC_C_AUTHN_WINNT, 
         RPC_C_AUTHZ_NONE, 
         NULL, 
         RPC_C_AUTHN_LEVEL_DEFAULT, 
         RPC_C_IMP_LEVEL_IMPERSONATE,
         NULL, 
         EOAC_NONE 
    );
    if (FAILED(hr))
    {
       cout << "Cannot set proxy blanket. Error code: 0x"
            << hex << hr << endl;
       pUnk->Release();
       return hr;
    }

    // Clean up the IUnknown.
    pUnk->Release();

    IWbemRefresher* pRefresher = NULL;
    IWbemConfigureRefresher* pConfig = NULL;

    // Create a WMI Refresher and get a pointer to the
    // IWbemConfigureRefresher interface.
    CoCreateInstance(CLSID_WbemRefresher, 
                     NULL,
                     CLSCTX_INPROC_SERVER, 
                     IID_IWbemRefresher, 
                     (void**) &pRefresher 
    );
    
    pRefresher->QueryInterface(IID_IWbemConfigureRefresher,
                               (void**) &pConfig );

    IWbemClassObject* pObj = NULL;

    // Add the instance to be refreshed.
    pConfig->AddObjectByPath(
       pNameSpace,
       L"Win32_PerfRawData_PerfProc_Process.Name=\"WINWORD\"",
       0L,
       NULL,
       &pObj,
       NULL 
    );
    if (FAILED(hr))
    {
       cout << "Cannot add object. Error code: 0x"
            << hex << hr << endl;
       pNameSpace->Release();
       
       return hr;
    }

    // For quick property retrieval, use IWbemObjectAccess.
    IWbemObjectAccess* pAcc = NULL;
    pObj->QueryInterface(IID_IWbemObjectAccess, 
                         (void**) &pAcc );

    // This is not required.
    pObj->Release();

    // Get a property handle for the VirtualBytes property.
    long lVirtualBytesHandle = 0;
    DWORD dwVirtualBytes = 0;

    pAcc->GetPropertyHandle(L"VirtualBytes", 
                            &variant, 
                            &lVirtualBytesHandle );

    // Refresh the object ten times and retrieve the value.
    for( int x = 0; x < 10; x++ )
    {
        pRefresher->Refresh( 0L );
        pAcc->ReadDWORD( lVirtualBytesHandle, &dwVirtualBytes );
        printf( "Process is using %lu bytes\n", dwVirtualBytes );
        // Sleep for a second.
        Sleep( 1000 );
    }
    // Clean up all the objects.
    pAcc->Release();
    // Done with these too.
    pConfig->Release();
    pRefresher->Release();
    pNameSpace->Release();
}
SysFreeString( bstrNameSpace );
pWbemLocator->Release();

třídy čítačů výkonu

úlohy rozhraní WMI: Monitorování výkonu