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"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构造函数中创建的。
这解决了我的问题。希望它能帮助到别人。