我有一个命令行程序 (c#),它根据机器 key 加密配置文件。
powershell 脚本将构建复制到目标服务器,相应地修改配置并安装 Windows 服务。
所有 Windows 服务都以本地系统帐户(标准用户,非管理员)运行 - 我们称此帐户为“locuser”。
目标服务器是 Win 2012 R2 服务器。以上所有这些都是通过从 Build Server 远程 PS 到此 Target 服务器来实现的。
现在,我需要以“locuser”的身份运行加密命令行程序,以便程序可以使用帐户特定 key 进行加密。
我知道这可以通过调用 Start-Process
轻松实现带有 -Credentials
的 cmdlet范围。好吧,这就是问题所在,如果我在 (RDP) 中远程连接到目标服务器然后运行 Start-Process .... -Credential $cred
,则上述工作正常。从 Powershell 控制台。
但是,我需要在部署时远程(使用我的脚本)到 TargetServer 时使用它。当我远程访问 TargetServer 时,我使用具有管理员权限的凭据。
我试过以下
Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI
授予“locuser”“完全控制”和“调用(执行)”权限。命令。我已经为这两个 Microsoft.Powershell
运行了这个命令和 Microsoft.Powershell32
- 仍然获得拒绝访问 我很确定,PS Remoting 方面有一些配置我错过了但不知道是什么 - 因为 Powershell 给我的所有配置都是
Access Denied
错误(见屏幕截图)几乎没有有用的信息来进一步排除故障。此外,检查事件日志是否有任何痕迹,但无济于事。
最佳答案
你已经成为可怕的 Double Hop 的牺牲品。基本上,您是从计算机 A 到计算机 B 进行身份验证,然后尝试再次从计算机 B 到计算机 C 进行身份验证(在这种情况下也恰好是 B)。
如果可能的话,您最好结束 session 并使用 locuser 凭据开始一个新 session ,然后调用 Start-Process。另一种更困惑的方法是使用 schtasks。
我可以在同一个 session 中告诉你如何做,但它有点困惑而且非常复杂,应该只是最后的手段:
在原始服务器(构建服务器)上:
Enable-WSManCredSSP -Role Client -Delegate [name]
在哪里 [name]
是一个 IP 或 DNS 地址/范围,包括任何目标服务器(例如“192.168.1.*”)Computer Configuration\Administrative Templates\System\Credentials Delegation
并检查规则 Allow delegating fresh credentials
和 Allow delegating fresh credentials with NTLM...
已启用并包括 [name]
在目标服务器上:
Enable-WSManCredSSP -Role Server
运行命令:
Invoke-Command [targetserver] [-Credential $cred] -Scriptblock {
## do stuff
Invoke-Command . -Credential $locusercred -Authentication Credssp -ScriptBlock {
Start-Process -FilePath $sc #etc
}
}
需要注意的一些事项:
首先我使用这个设置来创建一个本地 session ,然后从那里远程(所以 A-A-B 而不是 A-B-B)所以组策略的东西可能在错误的地方,但很确定它是正确的。
其次,我发现凭证在 session 中工作很痛苦(在本例中为
$locusercred
)。我确实让它在本地运行,但奇怪的是它突然无法解密安全字符串。我最终将带有已定义 key 的安全字符串保存到注册表中,以便始终可以从任何帐户对其进行解密,您可能需要在那里提出自己的解决方案。所有这些内容都在免费电子书 "The Secrets of PowerShell Remoting" 中进行了解释。 ,如果您选择双跳方法,我建议您阅读一下。
关于Powershell远程处理-无法以其他用户身份执行exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38330700/