我有一台运行构建的Jenkins机器,但是我希望在我的Jenkins从属服务器上作为操作系统的替代用户运行脚本。
我可以在我的GNU / Linux机器上使用对称键和ssh中的authorized_keys
执行此操作,但在某些Windows机器上执行相同操作时遇到很多麻烦。
我想使用Powershell
来运行我感兴趣的命令。
我希望运行特定命令的用户收到Access Denied
错误。我可以使用Invoke-Command
使用AD管理帐户运行Get-Credential
,它可以正常运行,但不能像其他AD用户一样运行,因此我知道winrm
正在运行。
如何添加特定AD用户以在特定主机上运行Invoke-Command
或Enter-PSSession
?
与该问题相关,AD管理员如何访问运行winrm
的任何计算机?我可以在某种程度上为目标机器上的一个用户本地模拟吗?
答案 0 :(得分:1)
如果您要对this进行身份验证,那么您需要为每个身份验证用户导出一个新文件,并在密码更改后:
read-host -assecurestring | convertfrom-securestring | out-file UserOneSecureString.txt
我会用about_remote和about_remote_troubleshooting的文档向您提出问题的更一般部分,您可能已经看过了。
答案 1 :(得分:0)
经过一番阅读后,这个问题可以减少到Impersonating a domain user on a host in Powershell non-interactively.
要以非交互方式在PowerShell中模拟用户,您必须执行以下操作:
我们将使用的主机需要启用Windows远程管理,有一个powershell命令可以为您完成所有工作。
Enable-PSRemoting -Force
如果用户不是主机的管理员,则必须将其添加到Powershell会话配置中。然后,您可以控制要为该主机上的用户提供哪种访问权限。
Set-PSSessionConfiguration Microsoft.PowerShell -ShowSecurityDescriptorUI
Credssp处理微软产品上的double-hop or second-hop issue。
这允许用户进行凭据转发,以访问可能不在本地主机上的服务,例如网络共享。
在许多情况下,从机器A登录到机器B并在机器C上需要资源时,这是一个问题。
在这种情况下,机器A和B是同一主机,因此我们在主机上启用Credssp作为Client
和Server
角色。
Enable-WSManCredSSP -Role Client -Delegate $env:COMPUTERNAME
Enable-WSManCredSSP -Role Server
在#am; noam'的答案中提到了这一点。
可以通过将域用户的密码导出到文件来使用非对称密钥。
然后,可以读取文件并在主机上启动新的PowerShell会话。
Read-Host -AsSecureString "Write the password: " | ConvertFrom-SecureString | Out-File C:\somelocation\users-pass-key-file.txt
现在,您可以通过使用密钥读取文件并登录主机来启动Powershell中的非交互式登录会话。
$user = "DOMAIN\username"
$passkey = Get-Content C:\somelocation\users-pass-key-file.txt | ConvertTo-SecureString
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user,$passkey
Invoke-Command -ComputerName $env:COMPUTERNAME -ScriptBlock { Write-Output $env:USERNAME } -Credential $credential -Authentication Credssp
完成上述步骤后,您可以使用Jenkins从站或master来代表其他用户执行Powershell命令。
这必须通过使用相关主机上存储的凭据以适当的前言运行Invoke-Command
来完成。