Example: Calling a Provider Method (Windows)(學習學習)

來源:互聯網
上載者:User

原文地址: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 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 a SOLE_AUTHENTICATION_LIST structure in the pAuthList parameter of 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 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 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 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 a

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.