Example: Calling a Provider Method (Windows)(学习学习)

来源:互联网 发布:leetcode题解 java版 编辑:程序博客网 时间:2024/06/05 14:35

原文地址:http://msdn.microsoft.com/en-us/library/windows/desktop/aa390421%28v=vs.85%29.aspx

Aa390421.wedge(en-us,VS.85).gifTo call a provider method

  1. Initialize COM parameters with a call to CoInitializeEx.

    For more information, see Initializing COM for a WMI Application.

  2. Initialize COM process security by calling CoInitializeSecurity.
    Windows 2000:  Specify the default authentication credentials for a user by using aSOLE_AUTHENTICATION_LIST structure in the pAuthList parameter ofCoInitializeSecurity.

    For more information, see Setting the Default Process Security Level Using C++.

  3. Obtain the initial locator to WMI by calling CoCreateInstance.

    For more information, see Creating a Connection to a WMI Namespace.

  4. Obtain a pointer to IWbemServices for the root\cimv2 namespace on the local computer by callingIWbemLocator::ConnectServer. To connect to a remote computer, seeExample: Getting WMI Data from a Remote Computer.

    For more information, see Creating a Connection to a WMI Namespace.

  5. Set IWbemServices proxy security so the WMI service can impersonate the client by callingCoSetProxyBlanket.

    For more information, see Setting the Security Levels on a WMI Connection.

  6. Use the IWbemServices pointer to make requests to WMI. This example usesIWbemServices::ExecMethod to call the provider methodWin32_Process::Create.

    For more information about making requests to WMI, see Manipulating Class and Instance Information and Calling a Method.

    If the provider method has any in-parameters or out-parameters, then values of the parameters must be given toIWbemClassObject pointers. For in-parameters, you must spawn an instance of the in-parameter definitions, and then set the values of these new instances. TheWin32_Process::Create method requires a value for the CommandLine in-parameter to execute properly.

    The following code example creates an IWbemClassObject pointer, spawns a new instance of the Win32_Process::Create in-parameter definitions, and then sets the value of theCommandLine in-parameter to Notepad.exe.

    C++
    // Set up to call the Win32_Process::Create methodBSTR MethodName = SysAllocString(L"Create");BSTR ClassName = SysAllocString(L"Win32_Process");IWbemClassObject* pClass = NULL;hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);IWbemClassObject* pInParamsDefinition = NULL;hres = pClass->GetMethod(MethodName, 0,     &pInParamsDefinition, NULL);IWbemClassObject* pClassInstance = NULL;hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);// Create the values for the in-parametersVARIANT varCommand;varCommand.vt = VT_BSTR;varCommand.bstrVal = L"notepad.exe";// Store the value for the in-parametershres = pClassInstance->Put(L"CommandLine", 0,    &varCommand, 0);wprintf(L"The command is: %s\n", V_BSTR(&varCommand));

    The following code example shows how the Win32_Process::Create method out-parameters are given to an IWbemClassObject pointer. The out-parameter value is obtained with theIWbemClassObject::Get method and stored in aVARIANT variable so that it can be displayed to the user.

    C++
    // Execute MethodIWbemClassObject* pOutParams = NULL;hres = pSvc->ExecMethod(ClassName, MethodName, 0,    NULL, pClassInstance, &pOutParams, NULL);VARIANT varReturnValue;hres = pOutParams->Get(_bstr_t(L"ReturnValue"), 0,     &varReturnValue, NULL, 0);

The following code example shows how to call a provider method using WMI.

C++
#define _WIN32_DCOM#include <iostream>using namespace std;#include <comdef.h>#include <Wbemidl.h># pragma comment(lib, "wbemuuid.lib")int main(int iArgCnt, char ** argv){    HRESULT hres;    // Step 1: --------------------------------------------------    // Initialize COM. ------------------------------------------    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);     if (FAILED(hres))    {        cout << "Failed to initialize COM library. Error code = 0x"              << hex << hres << endl;        return 1;                  // Program has failed.    }    // Step 2: --------------------------------------------------    // Set general COM security levels --------------------------    // Note: If you are using Windows 2000, you must specify -    // the default authentication credentials for a user by using    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----    // parameter of CoInitializeSecurity ------------------------    hres =  CoInitializeSecurity(        NULL,         -1,                          // COM negotiates service        NULL,                        // Authentication services        NULL,                        // Reserved        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication         RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation          NULL,                        // Authentication info        EOAC_NONE,                   // Additional capabilities         NULL                         // Reserved        );                          if (FAILED(hres))    {        cout << "Failed to initialize security. Error code = 0x"              << hex << hres << endl;        CoUninitialize();        return 1;                      // Program has failed.    }        // Step 3: ---------------------------------------------------    // Obtain the initial locator to WMI -------------------------    IWbemLocator *pLoc = NULL;    hres = CoCreateInstance(        CLSID_WbemLocator,                     0,         CLSCTX_INPROC_SERVER,         IID_IWbemLocator, (LPVOID *) &pLoc);     if (FAILED(hres))    {        cout << "Failed to create IWbemLocator object. "             << "Err code = 0x"             << hex << hres << endl;        CoUninitialize();        return 1;                 // Program has failed.    }    // Step 4: ---------------------------------------------------    // Connect to WMI through the IWbemLocator::ConnectServer method    IWbemServices *pSvc = NULL;    // Connect to the local root\cimv2 namespace    // and obtain pointer pSvc to make IWbemServices calls.    hres = pLoc->ConnectServer(        _bstr_t(L"ROOT\\CIMV2"),         NULL,        NULL,         0,         NULL,         0,         0,         &pSvc    );        if (FAILED(hres))    {        cout << "Could not connect. Error code = 0x"              << hex << hres << endl;        pLoc->Release();             CoUninitialize();        return 1;                // Program has failed.    }    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;    // Step 5: --------------------------------------------------    // Set security levels for the proxy ------------------------    hres = CoSetProxyBlanket(        pSvc,                        // Indicates the proxy to set        RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx         RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx         NULL,                        // Server principal name         RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx         RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx        NULL,                        // client identity        EOAC_NONE                    // proxy capabilities     );    if (FAILED(hres))    {        cout << "Could not set proxy blanket. Error code = 0x"              << hex << hres << endl;        pSvc->Release();        pLoc->Release();             CoUninitialize();        return 1;               // Program has failed.    }    // Step 6: --------------------------------------------------    // Use the IWbemServices pointer to make requests of WMI ----    // set up to call the Win32_Process::Create method    BSTR MethodName = SysAllocString(L"Create");    BSTR ClassName = SysAllocString(L"Win32_Process");    IWbemClassObject* pClass = NULL;    hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);    IWbemClassObject* pInParamsDefinition = NULL;    hres = pClass->GetMethod(MethodName, 0,         &pInParamsDefinition, NULL);    IWbemClassObject* pClassInstance = NULL;    hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);    // Create the values for the in parameters    VARIANT varCommand;    varCommand.vt = VT_BSTR;    varCommand.bstrVal = L"notepad.exe";    // Store the value for the in parameters    hres = pClassInstance->Put(L"CommandLine", 0,        &varCommand, 0);    wprintf(L"The command is: %s\n", V_BSTR(&varCommand));    // Execute Method    IWbemClassObject* pOutParams = NULL;    hres = pSvc->ExecMethod(ClassName, MethodName, 0,    NULL, pClassInstance, &pOutParams, NULL);    if (FAILED(hres))    {        cout << "Could not execute method. Error code = 0x"              << hex << hres << endl;        VariantClear(&varCommand);        SysFreeString(ClassName);        SysFreeString(MethodName);        pClass->Release();        pInParamsDefinition->Release();        pOutParams->Release();        pSvc->Release();        pLoc->Release();             CoUninitialize();        return 1;               // Program has failed.    }    // To see what the method returned,    // use the following code.  The return value will    // be in &varReturnValue    VARIANT varReturnValue;    hres = pOutParams->Get(_bstr_t(L"ReturnValue"), 0,         &varReturnValue, NULL, 0);    // Clean up    //--------------------------    VariantClear(&varCommand);    VariantClear(&varReturnValue);    SysFreeString(ClassName);    SysFreeString(MethodName);    pClass->Release();    pInParamsDefinition->Release();    pOutParams->Release();    pLoc->Release();    pSvc->Release();    CoUninitialize();    return 0;}