WMI使用WCF启动远程进程

本文关键字:进程 程进程 使用 WCF 启动 WMI | 更新日期: 2023-09-27 17:58:52

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

我从codeproject中实现了代码,在InvokeMethod函数上的操作失败。错误为"拒绝访问"。(HRESULT中出现异常:0x80070005(E_ACCESSDENIED)'。

我使用WBEMTEST工具测试了WMI连接,它在同一域和另一域中的PC上使用相同的参数集(远程服务器的路径、用户名/密码、运行应用程序的路径)都很好。用于模拟的帐户是按照本教程中的方式设置的。既然它与WBEMTEST一起工作,那么在使用WCF进行此调用时,有什么具体的事情需要检查吗?我读到在web.config的诊断部分将wmiProviderEnabled设置为"true"可能会有所帮助,但事实并非如此。

WMI使用WCF启动远程进程

终于解决了这个问题。

首先,我将本文中"启用WMI"answers"安全性"两段中描述的内容应用到我的配置中。这还不够,在我的调查中,我在前面提到的代码项目源代码中发现了一个可能的错误。在ProcessMethod类中的StartProcess函数中,connectionScope未添加到ManagementClass。因此,我在构造函数中添加了ManagementScope connectionScope参数,然后填充processTask.Scope。请查看我更新的StartPtrocess函数:

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

这解决了我的问题。希望它能帮助到别人。