我有一个命令行程序(c#),它根据机器密钥加密配置文件。 powershell脚本将构建复制到目标服务器,相应地修改配置并安装Windows服务。 所有Windows服务都以本地系统帐户(标准用户,非管理员)运行 - 让我们将此帐户称为“locuser”。
目标服务器是Win 2012 R2服务器。所有这些都是通过从远程构建服务器到此目标服务器的PS远程处理实现的。
现在,我需要将加密命令行程序作为“locuser”运行,以便程序可以使用特定于帐户的密钥进行加密。
我知道通过使用Start-Process
参数调用-Credentials
cmdlet可以轻松实现这一点。好吧,这是捕获,如果我远程(RDP)到目标服务器然后从Powershell控制台运行Start-Process .... -Credential $cred
,上面的工作正常。
但是,我在部署时远程(使用我的脚本)到TargetServer时需要这个工作。当我远程访问TargetServer时,我使用具有管理员权限的凭据。
我尝试了以下
Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI
命令授予“locuser”“完全控制”和“调用(执行)”权限。我为Microsoft.Powershell
和Microsoft.Powershell32
运行此命令 - 仍然获得拒绝访问我很确定,PS Remoting Side上有一些配置,我错过了但却无法弄清楚是什么 - 因为所有Powershell都抛出了我Access Denied
错误(见截图) )几乎没有有用的信息可以进一步排除故障。
此外,检查事件日志是否有任何痕迹但无效。
答案 0 :(得分:0)
你已经成为可怕的双跳的猎物。基本上你要从计算机A到计算机B进行身份验证,然后再尝试从计算机B再到计算机C进行身份验证(在这种情况下也恰好是B)。
如果可能的话,最好结束会话并使用locuser凭据启动一个新会话,然后只需调用Start-Process。另一个更混乱的方法是使用schtasks。
我可以告诉你如何在同一个会话中做到这一点,但它有点混乱,非常复杂,应该只是最后的手段:
在原始服务器(构建服务器)上:
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
}
}
有些事情需要注意:
首先我使用这个设置来创建一个本地会话,然后远程那里(所以A-A-B而不是A-B-B)所以组策略的东西可能在错误的地方,但很确定它是对的。
其次,我发现凭据在会话中工作很麻烦(在本例中为$locusercred
)。我确实让它本地化,但很奇怪它突然无法解密。我最终将一个带有已定义密钥的securestring保存到注册表中,以便始终可以从任何帐户解密,您可能需要在那里提出自己的解决方案。
所有这些内容都在免费的电子书"The Secrets of PowerShell Remoting"中进行了解释,如果您选择双跳方法,我建议您阅读。