使用WCF通过WMI启动远程进程

时间:2014-04-18 15:44:48

标签: c# wcf process wmi impersonation

我想通过从WCF服务调用WMI来在远程计算机上启动进程(非交互式小型控制台应用程序)。这意味着用户将从Web应用程序运行的WCF操作。

我实现了codeproject的代码,我的操作在InvokeMethod函数上失败了。错误是“访问被拒绝。 (来自HRESULT的异常:0x80070005(E_ACCESSDENIED)'。

我使用WBEMTEST工具测试了WMI连接,它可以在同一个PC和另一个PC中使用相同的参数集(远程服务器的路径,用户名/密码,运行应用程序的路径)。域。用于模拟的帐户设置如this tutorial。由于它与WBEMTEST一起使用,在使用WCF进行此调用时是否有任何特定的事情需要检查?我读到在web.config的诊断部分将wmiProviderEnabled设置为'true'可能有所帮助,但事实并非如此。

1 个答案:

答案 0 :(得分:0)

最后我能够解决这个问题。

首先,我在我的配置中应用了article中描述的所有内容,其中包括“启用WMI'和'安全'。 这还不够,在我的调查中,我发现上述代码项目源代码中可能存在错误。在位于ProcessMethod类中的StartProcess函数中,未将connectionScope添加到ManagementClass。因此,我将一个ManagementScope connectionScope参数添加到构造函数中,然后填充processTask.Scope。请查看我更新的StartPtocess函数:

public static int StartProcess(string machineName, string processPath, ManagementScope connnectionScope, int timeout)
{
    ManagementClass processTask = new ManagementClass(@"\\" + machineName + @"\root\CIMV2",
                                                                    "Win32_Process", null);
    processTask.Scope = connnectionScope;
    ManagementBaseObject methodParams = processTask.GetMethodParameters("Create");
    methodParams["CommandLine"] = processPath;
    InvokeMethodOptions options = new InvokeMethodOptions();
    options.Timeout = TimeSpan.FromSeconds(timeout);
    ManagementBaseObject exitCode = processTask.InvokeMethod("Create", methodParams, null);

    return Convert.ToInt32(exitCode["ReturnValue"].ToString());
}

ManagementScope在ProcessLocal / ProcessRemote构造函数中创建。

这解决了我的问题。希望它可以帮到某人。