【问题标题】:Using WCF to start a remote process by WMI使用 WCF 通过 WMI 启动远程进程
【发布时间】:2014-06-03 03:54:18
【问题描述】:

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

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

我使用 WBEMTEST 工具测试了 WMI 连接,它在同一组和另一台 PC 上使用相同的参数集(远程服务器的路径、用户名/密码、要运行的应用程序的路径)运行良好领域。用于模拟的帐户设置为this tutorial。由于它与 WBEMTEST 一起使用,因此在使用 WCF 进行此调用时是否需要检查任何具体事项?我在 web.config 的诊断部分中将 wmiProviderEnabled 设置为“true”可能会有所帮助,但它没有。

【问题讨论】:

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

标签: c# wcf process wmi impersonation


【解决方案1】:

终于解决了这个问题。

首先,我将article 中“启用 WMI”和“安全性”段落中描述的所有内容应用于我的配置。 这还不够,在我的调查中,我在前面提到的 codeproject 源代码中发现了一个可能的错误。在位于 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 构造函数中创建。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    相关资源
    最近更新 更多