Powershell远程处理-无法以其他用户身份执行exe

标签 powershell remoting

我有一个命令行程序 (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 - 仍然获得拒绝访问
  • 我已经编辑了“本地安全策略”->“本地策略”->“用户权限分配”->在身份验证后模拟客户端-并添加了管理员帐户(我登录时使用)和“locuser”帐户-仍然获得拒绝访问
  • 我还授予 locuser 管理员权限 - 仍然拒绝访问

  • 我很确定,PS Remoting 方面有一些配置我错过了但不知道是什么 - 因为 Powershell 给我的所有配置都是 Access Denied错误(见屏幕截图)几乎没有有用的信息来进一步排除故障。

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

    PS Remoting Error

    最佳答案

    你已经成为可怕的 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.*”)
  • 打开 GPEdit.msc,导航到 Computer Configuration\Administrative Templates\System\Credentials Delegation并检查规则 Allow delegating fresh credentialsAllow 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/

    相关文章:

    azure - 我们可以使用任何命令/脚本/ARM 模板创建 Azure 服务连接吗?

    powershell - 如何在新的 "Cool"层中创建新的 Azure 存储帐户

    .net - 从 .net 4.5 测试调用 .net 2.0 方法会导致 RemotingException

    c# - 远程调用永不返回

    c# - 创造性地使用 MarshalByRefObject

    spring - 如何使用 Spring 注解实现远程处理?

    regex - PowerShell 从字符串中解析名称和版本

    powershell - 在 PowerShell 中检查路径是否存在的更好方法

    Powershell - 合并 CSV 文件并附加一列

    wcf - 从 WCF 服务返回接口(interface)