我们的应用程序需要在远程计算机上(在与客户端计算机相同的域下)与当前(非管理员)用户一起生成进程,并让该远程进程通过WCF与客户端进行通信。我们使用System.Management下的WMI类来启动远程进程。我的问题是,当以这种方式启动时,远程进程在尝试使用Net.Tcp端口共享服务时遇到访问被拒绝错误。我们对Windows下围绕WCF和TCP端口共享的问题非常熟悉,并且知道在尝试修改SMSvcHost.exe.config时可能遇到的各种陷阱。在与同一用户相同的机器上手动运行的相同过程可以正常工作。只有通过WMI启动时才会出现问题。确切的例外是:
System.ServiceModel.CommunicationException:服务端点无法侦听URI' net.tcp:// localhost / blah'因为访问被拒绝了。验证当前用户是否在SMSvcHost.exe.config的相应allowAccounts部分中被授予访问权限。 ---> System.ComponentModel.Win32Exception:访问被拒绝
我意识到如果没有为当前用户正确配置端口共享,这将是同样的例外,所以我只想再次强调已配置端口共享,因此希望避免回答请参阅解释如何设置的链接。已添加单个用户帐户SID及其若干组。此问题特别与通过WMI远程生成的进程有关。我假设WMI生成的进程必须有一些稍微不同的安全上下文,阻止它访问端口共享,但我无法确定关键区别是什么。
以下是产生远程进程的客户端代码:
private void SpawnRemoteService(string host, string cmd, string args)
{
ManagementScope scope = new ManagementScope(@"\\" + host + @"\root\cimv2");
var path = new ManagementPath("Win32_Process");
using (var proc = new ManagementClass(scope, path, null))
{
using (var start = new ManagementClass("Win32_ProcessStartup"))
{
using (var createParams = proc.GetMethodParameters("Create"))
{
createParams["CommandLine"] = String.Format("{0} {1}", cmd, args);
createParams["ProcessStartupInformation"] = start;
using (var ret = proc.InvokeMethod("Create", createParams, null)) ;
}
}
}
}
远程进程启动,但是当它尝试创建ServiceHost对象时,它会获得上述异常并死掉。