我想通过从WCF服务调用WMI在远程计算机上启动一个进程(非交互式的小型控制台应用程序)。这是用户将从Web应用程序运行的WCF操作。
我实现了codeproject中的代码,并且对InvokeMethod函数的操作失败。错误是“访问被拒绝。(来自HRESULT的异常:0x80070005(E_ACCESSDENIED)”。
我使用WBEMTEST工具测试了WMI连接,它在同一域和另一域中的PC上都可以与同一组参数(到远程服务器的路径,用户名/密码,要运行的应用程序的路径)一起使用,效果很好。像本教程中一样设置用于模拟的帐户。由于它可以与WBEMTEST一起使用,因此在使用WCF进行此调用时是否需要检查某些特定事项?我读到在web.config的诊断部分将wmiProviderEnabled设置为'true'可能会有所帮助,但没有帮助。
最后,我能够解决此问题。
首先,我将本文在“启用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构造函数中创建。
这解决了我的问题。希望它可以帮助某人。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句