Example: calling a provider method (Windows) (learning)

Source: Internet
Author: User

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

To call a provider Method

  1. Initialize com parameters with a call
    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 Sole_authentication_listStructure in the pauthlist parameter Coinitializesecurity.

    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
    IwbemservicesFor 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
    IwbemservicesProxy 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
    IwbemservicesPointer to make requests to WMI. This example usesIwbemservices: execmethodTo call the provider Method

    Win32_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 givenIwbemclassobjectPointers.
    In-parameters, you must spawn an instance of the in-parameter definitions, and then set the values of these new instances.Win32_process: Create
    Method requires a value forCommandLineIn-parameter to execute properly.

    The following code example creates
    IwbemclassobjectPointer, spawns a new instance of
    Win32_process: CreateIn-parameter definitions, and then sets the value ofCommandLineIn-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
    Win32_process: CreateMethod Out-parameters are given to
    IwbemclassobjectPointer. The out-parameter value is obtained withIwbemclassobject: GetMethod and stored in

    VariantVariable 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;}

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.