我想通过从WCF服务调用WMI来在远程计算机上启动进程(非交互式小型控制台应用程序)。这意味着用户将从Web应用程序运行的WCF操作。
我实现了codeproject的代码,我的操作在InvokeMethod函数上失败了。错误是“访问被拒绝。 (来自HRESULT的异常:0x80070005(E_ACCESSDENIED)'。
我使用WBEMTEST工具测试了WMI连接,它可以在同一个PC和另一个PC中使用相同的参数集(远程服务器的路径,用户名/密码,运行应用程序的路径)。域。用于模拟的帐户设置如this tutorial。由于它与WBEMTEST一起使用,在使用WCF进行此调用时是否有任何特定的事情需要检查?我读到在web.config的诊断部分将wmiProviderEnabled设置为'true'可能有所帮助,但事实并非如此。
答案 0 :(得分:0)
最后我能够解决这个问题。
首先,我在我的配置中应用了article中描述的所有内容,其中包括“启用WMI'和'安全'。 这还不够,在我的调查中,我发现上述代码项目源代码中可能存在错误。在位于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构造函数中创建。
这解决了我的问题。希望它可以帮到某人。