C++ 在C+中使用Win32#u Process.GetOwner+;

C++ 在C+中使用Win32#u Process.GetOwner+;,c++,wmi,C++,Wmi,我试图使用WMI类Win32_进程来获取正在运行的进程以及每个进程所有者的用户的列表。使用MSN()中的枚举实例,简单地将Wi32操作系统转换为Wi32进程,使用C++中的Wi32进程进行枚举并不困难。我发现,通过使用Win32_进程的GetOwner方法,我可以获得进程所有者的用户和域。VB()中有一个很好的例子,它表明我可以使用枚举器对象在枚举中的任何给定点调用GetOwner的特定实例来获取流程信息 我尝试使用代码示例()来“调用提供者方法”,以了解如何对GetOwner进行方法调用,但我

我试图使用WMI类Win32_进程来获取正在运行的进程以及每个进程所有者的用户的列表。使用MSN()中的枚举实例,简单地将Wi32操作系统转换为Wi32进程,使用C++中的Wi32进程进行枚举并不困难。我发现,通过使用Win32_进程的GetOwner方法,我可以获得进程所有者的用户和域。VB()中有一个很好的例子,它表明我可以使用枚举器对象在枚举中的任何给定点调用GetOwner的特定实例来获取流程信息

我尝试使用代码示例()来“调用提供者方法”,以了解如何对GetOwner进行方法调用,但我无法了解如何使其工作。我不断地遇到路障。通常我会得到无效的方法参数。以下面的代码块为例

        BSTR MethodName = SysAllocString(L"GetOwner");
        BSTR ClassName = SysAllocString(L"Win32_Process");

        IWbemClassObject* pClass = NULL;
        hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);
        printf("[1] hres = %08x\n", hres);

        IWbemClassObject* pInParamsDefinition = NULL;
        IWbemClassObject* pOutParams = NULL;
        hres = pClass->GetMethod(MethodName, 0, &pInParamsDefinition, &pOutParams);
        printf("[2] hres = %08x (%08x, %08x)\n", hres, pInParamsDefinition, pOutParams);

        // Execute Method
        hres = pSvc->ExecMethod(L"Win32_Process", MethodName, 0, NULL, NULL, &pOutParams, NULL);

        VARIANT varReturnValue;
        hres = pOutParams->Get(_bstr_t(L"ReturnValue"), 0,
            &varReturnValue, NULL, 0);
        wprintf(L"The command is: %s\n", V_BSTR(&varReturnValue));
GetOwner没有输入参数,当我调用GetMethod时,pInParamsDefinition总是返回NULL,而pOutParams返回ptr。由于没有指针返回到pInParamsDefinition,因此我无法提供输入,因此我不知道如何避免方法参数无效的问题。显然WMI编程不是我最擅长的技能:)


我在这里遗漏了什么?

在断断续续地胡闹了一会儿之后,我终于找到了我自己问题的答案。问题是您需要指定要针对哪个对象执行该方法。为此,调用GetObject(“\uuu PATH”,…)以获取当前正在枚举的对象的路径,并将GetObject的结果(BSTR)作为第一个参数传递给ExecMethod。在我的例子GetOwner中,这告诉方法您试图针对什么执行。下面是我编写的一个示例程序,它转储进程及其所有者的当前列表

\define\u WIN32\u DCOM
#包括
使用名称空间std;
#包括
#包括
#pragma注释(lib,“wbemuid.lib”)
int main(int argc,字符**argv)
{
HRESULT hres;
//步骤1:--------------------------------------------------
//初始化COM------------------------------------------
hres=CoInitializeX(0,Conit_多线程);
如果(失败(hres))
{
不能释放();
}
//清理
// ========
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
coninitialize();
返回0;//程序已成功完成。

}
谢谢@tjac,这帮助我解决了调用类方法时遇到的问题。我还发现这是非常有用的:。它有一个很棒的WMI实用程序,可以大大减少使用WMI时必须键入的样板文件。