【发布时间】:2016-11-08 02:00:35
【问题描述】:
我的环境配置如下:
-
我的 Windows 服务在“NT AUTHORITY\SYSTEM”下运行的“目标”机器。此 Windows 服务有一个 .NET Remoting 安全 IPC 端口,如下所示:
Dictionary<string, object> properties = new Dictionary<string, object>(); properties["authorizedGroup"] = GetUsersGroupName(); // "S-1-5-32-545" SID, setting to "S-1-1-0" gives the same result properties["name"] = configuration.ServiceShortName + ".Server"; properties["portName"] = configuration.ServiceGuid; BinaryServerFormatterSinkProvider sinkProvider = new BinaryServerFormatterSinkProvider(); sinkProvider.TypeFilterLevel = TypeFilterLevel.Full; Channel = new IpcServerChannel(properties, sinkProvider); Channel.IsSecured = true; ChannelServices.RegisterChannel(Channel, true); -
“呼叫者”机器,从域认证帐户 (DOMAIN\Caller) 远程调用“目标”机器上的 本地(“目标”上的本地)应用程序(我们将其命名为 TargetApp)通过 Powershell 远程处理(WS-Management):
$session = new-pssession -computerName "$targetHost" Invoke-Command -Session $session -Args $application,$arguments -OutVariable output -scriptblock $scriptBlockRemote Remove-PSSession $session 在“目标”机器上本地调用的 TargetApp(由于来自“调用者”的 powershell 远程调用)必须在同一“目标”机器(即 IPC服务器在同一台 Target 机器上的 windows 服务下运行)
在此配置中调用 IPC 服务器的任何尝试都以:
无法连接到 IPC 端口:访问被拒绝。
观察:
- 在服务器通道初始化期间将属性 ["authorizedGroup"] 更改为 "Everyone" ("S-1-1-0") 并没有帮助,我得到同样的错误。完全禁用服务器通道上的安全性会产生相同的结果。
-
当“调用者”在“目标”机器上调用 TargetApp 时,我可以清楚地看到:
- “C:\Windows\system32\wsmprovhost.exe -Embedding”进程在“Caller”用户凭据(“DOMAIN\Caller”)下的“Target”机器上启动
- “Target”上的 wsmprovhost.exe 然后调用“Caller”用户凭据(“DOMAIN\Caller”)下的 TargetApp
- 当应用程序到达调用 IPC 服务器的点时,它会失败
基本上我可以清楚地看到 powershell 确实在预期凭据下调用“目标”机器上的本地 TargetApp,但是由于某种原因 IPC 调用失败(尽管有两个进程 - 执行 IPC 客户端调用的 TargetApp 和包含 IPC 服务器的 windows 服务 - 在同一台机器上,IPC 调用失败)
神奇地!如果我直接进入“Target”机器,在 DOMAIN\Caller 帐户凭据下运行“cmd”并以这种方式调用 TargetApp - IPC 调用成功!
我试图找到解决方案,过去似乎有几个人遇到过这个问题,但是没有明确的原因/原因/解决方案。
P.S. 经过一番研究,我怀疑这与身份验证有关,因为 Powershell Remoting 默认使用 Kerberos,而 IPC 通道仅适用于 NTLM: https://msdn.microsoft.com/en-us/library/azure/ms172351(v=vs.85).aspx
IPC 通道始终使用 NTLM 身份验证。不支持 Kerberos,因为 IPC 仅限于单台机器内的调用。
【问题讨论】:
标签: c# .net powershell powershell-remoting .net-remoting