使用WBEM_E_INVALID_METHOD_PARAMETERS从C ++执行WMI方法失败

时间:2016-02-08 22:38:34

标签: c++ windows powershell wmi wmi-query

我正在尝试使用C ++从WMI调用方法。但是pNamespace-> callMethod(..)失败并显示错误WBEM_E_INVALID_METHOD_PARAMETERS(0x8004102F)。

我正试图从...调用方法 命名空间:ROOT \ WMI 分类:CLEVO_GET 方法:SetKBLED(Static = False) 在参数中: ID:0 /名称:数据/类型:uint32 参数: 无

MOF: [WmiMethodId(103),Implemented,read,write,Description(“SetKBLED”)] void SetKBLED([in,Description(“SetKBLED”)] uint32 Data);

这是我的代码,但如前所述,“callMethod”函数永远不会工作并返回0x8004102F错误。谁知道出了什么问题?

#include <Windows.h>  
#include <iostream>  
#include <string> 
#include <WbemCli.h>  

#pragma comment(lib, "wbemuuid.lib")  

int main()
{
    IWbemLocator *pLocator = NULL;
    IWbemServices *pNamespace = 0;
    IWbemClassObject * pClass = NULL;
    IWbemClassObject * pOutInst = NULL;
    IWbemClassObject * pInClass = NULL;
    IWbemClassObject * pInInst = NULL;

    BSTR path = SysAllocString(L"root\\wmi");
    BSTR ClassPath = SysAllocString(L"CLEVO_GET");
    BSTR MethodName = SysAllocString(L"SetKBLED");
    BSTR ArgName = SysAllocString(L"Data");

    // Initialize COM and connect to WMI.

    HRESULT hr = CoInitialize(0);
    hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
        RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
    hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID *)&pLocator);
    hr = pLocator->ConnectServer(path, NULL, NULL, NULL, 0, NULL, NULL, &pNamespace);

    // Get the class object for the method definition.
    hr = pNamespace->GetObject(ClassPath, 0, NULL, &pClass, NULL);
    std::cout << "NAMESPACE-CLASS:: " << std::hex << hr << std::endl;

    // Get the input-argument class object and 
    // create an instance.
    hr = pClass->GetMethod(MethodName, 0, &pInClass, NULL);
    std::cout << "GET METHOD:: " << std::hex << hr << std::endl;
    hr = pInClass->SpawnInstance(0, &pInInst);
    std::cout << "SPAWN INSTANCE:: " << std::hex << hr << std::endl;

    // Set the property.
    VARIANT var;
    var.vt = VT_I4;
    var.iVal = 4096;
    //var.iVal = std::stoul("0x00001000", NULL, 16);

    hr = pInInst->Put(ArgName, 0, &var, 0);
    std::cout << "ADD VARIABLE:: " << std::hex << hr << std::endl;
    VariantClear(&var);

    // Call the method.
    //hr = pNamespace->ExecMethod(L"CLEVO_GET", L"SetKBLED", 0, NULL, NULL, NULL, NULL);
    hr = pNamespace->ExecMethod(ClassPath, MethodName, 0, NULL, pInInst, NULL, NULL);
    //hr = pNamespace->ExecMethod(ClassPath, MethodName, 0, NULL, NULL, NULL, NULL);
    std::cout << "EXEC RESULT:: " << std::hex << hr << std::endl;

    // Free up resources.
    SysFreeString(path);
    SysFreeString(ClassPath);
    SysFreeString(MethodName);
    SysFreeString(ArgName);
    pClass->Release();
    pInInst->Release();
    pInClass->Release();
    pLocator->Release();
    pNamespace->Release();
    CoUninitialize();


    // Wait for finish
    std::cout << "DONE! :)";
    std::cin.ignore();

    return 0;
}

我正在尝试使用C ++实现这一目标(此代码段以Powershell编写并且可以正常工作):

$clevo = get-wmiobject -query "select * from CLEVO_GET" -namespace "root\WMI"
$clevo.SetKBLED( [Convert]::ToUInt32("00001000", 16)  )
希望有人可以帮助我。任何帮助都是非常好的。 感谢。

0 个答案:

没有答案