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

C# 使用WCF通过WMI启动远程进程,c#,wcf,process,wmi,impersonation,C#,Wcf,Process,Wmi,Impersonation,我想通过从WCF服务调用WMI在远程计算机上启动一个进程(不是交互式的小型控制台应用程序)。这意味着用户将从web应用程序运行WCF操作 我从中实现了代码,但对InvokeMethod函数的操作失败。错误为“访问被拒绝”。(来自HRESULT的异常:0x80070005(E_ACCESSDENIED)') 我使用WBEMTEST工具测试了WMI连接,它在使用相同的参数集(到远程服务器的路径、用户名/密码、到要运行的应用程序的路径)时效果非常好来自同一域和其他域中的PC。用于模拟的帐户的设置与中类

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

我从中实现了代码,但对InvokeMethod函数的操作失败。错误为“访问被拒绝”。(来自HRESULT的异常:0x80070005(E_ACCESSDENIED)')


我使用WBEMTEST工具测试了WMI连接,它在使用相同的参数集(到远程服务器的路径、用户名/密码、到要运行的应用程序的路径)时效果非常好来自同一域和其他域中的PC。用于模拟的帐户的设置与中类似。由于它与WBEMTEST一起工作,使用WCF进行此调用时是否需要检查具体事项?我了解到,在web.config的diagnostics部分将wmiProviderEnabled设置为“true”可能会有所帮助,但它没有帮助。

最后我是able无法解决此问题

首先,我将“启用WMI”和“安全性”段落中描述的所有内容应用于我的配置。 这还不够,在我的调查中,我在前面提到的codeproject源代码中发现了一个可能的错误。在ProcessMethod类中的StartProcess函数中,connectionScope没有添加到ManagementClass中。因此,我向构造函数添加了ManagementScope connectionScope参数,然后填充了processTask.Scope。请查看我更新的StartPress函数:

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构造函数中创建的


这解决了我的问题。希望它对其他人有所帮助。

您可能也想检查一下。如果可能的话,我更愿意使用WMI-WBEMTEST的测试表明应该使用WMI。我感谢您的建议,但这种方法不适用于我的情况(身份验证、安全性等)我明白。我写了另一篇文章,这就是我提到它的原因;O)