Powershell远程处理 - 无法以另一个用户身份执行exe

时间:2016-07-12 13:44:57

标签: powershell remoting

我有一个命令行程序(c#),它根据机器密钥加密配置文件。 powershell脚本将构建复制到目标服务器,相应地修改配置并安装Windows服务。 所有Windows服务都以本地系统帐户(标准用户,非管理员)运行 - 让我们将此帐户称为“locuser”。

目标服务器是Win 2012 R2服务器。所有这些都是通过从远程构建服务器到此目标服务器的PS远程处理实现的。

现在,我需要将加密命令行程序作为“locuser”运行,以便程序可以使用特定于帐户的密钥进行加密。 我知道通过使用Start-Process参数调用-Credentials cmdlet可以轻松实现这一点。好吧,这是捕获,如果我远程(RDP)到目标服务器然后从Powershell控制台运行Start-Process .... -Credential $cred,上面的工作正常。

但是,我在部署时远程(使用我的脚本)到TargetServer时需要这个工作。当我远程访问TargetServer时,我使用具有管理员权限的凭据。

我尝试了以下

  1. 我已使用Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI命令授予“locuser”“完全控制”和“调用(执行)”权限。我为Microsoft.PowershellMicrosoft.Powershell32运行此命令 - 仍然获得拒绝访问
  2. 我编辑了“本地安全政策” - >“本地政策” - >“用户权利分配” - >认证后模拟客户端 - 并添加了管理员帐户(我登录)和“locuser”帐户 - 仍然获得拒绝访问
  3. 我还授予了locuser管理员权限 - 仍然获得拒绝访问
  4. 我很确定,PS Remoting Side上有一些配置,我错过了但却无法弄清楚是什么 - 因为所有Powershell都抛出了我Access Denied错误(见截图) )几乎没有有用的信息可以进一步排除故障。

    此外,检查事件日志是否有任何痕迹但无效。

    PS Remoting Error

1 个答案:

答案 0 :(得分:0)

你已经成为可怕的双跳的猎物。基本上你要从计算机A到计算机B进行身份验证,然后再尝试从计算机B再到计算机C进行身份验证(在这种情况下也恰好是B)。

如果可能的话,最好结束会话并使用locuser凭据启动一个新会话,然后只需调用Start-Process。另一个更混乱的方法是使用schtasks。

我可以告诉你如何在同一个会话中做到这一点,但它有点混乱,非常复杂,应该只是最后的手段:

在原始服务器(构建服务器)上:

  1. 运行命令Enable-WSManCredSSP -Role Client -Delegate [name],其中[name]是IP或DNS地址/范围,包括任何目标服务器(例如" 192.168.1。*")
  2. 打开GPEdit.msc,导航至Computer Configuration\Administrative Templates\System\Credentials Delegation并检查规则Allow delegating fresh credentialsAllow delegating fresh credentials with NTLM...是否已启用并包含[name]
  3. 在目标服务器上:

    1. 运行命令Enable-WSManCredSSP -Role Server
    2. 运行命令:

      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"中进行了解释,如果您选择双跳方法,我建议您阅读。