需要使用调用命令通过 powershell 远程访问第二个跃点

Need to remote access second hops via powershell with invoke-command

我现在在这个问题上纠结了很多时间,并且已经在另一个论坛上问过,这有助于接近解决方案,但最终我没有实现它。

我 "simply" 需要借助 powershell 脚本在我们公司的云中收集有关主机的信息。您可以通过本地网络的跳转主机访问云,跳转主机也是云的一部分。然后从跳转主机你可以到达所有的云主机。 所以我用 2 个 pssessions 尝试了这个并使用了 invoke-command(jumphost 和 cloudhost 的密码相同):

$cred = Get-Credential ad\username -Message "Please insert the password for the jumphost and the cloudhost"

$session = New-PSSession -ComputerName jumphost -Credential $cred

$cldhost = Read-Host "Please insert the name of the cloudhost"

$script = {
    Param (
        $Credential,
        $cloudhost
    )
    $ses = New-PSSession -ComputerName $cloudhost -Credential $Credential
    Invoke-Command -Session $ses -ScriptBlock { Get-ChildItem C:\ }
    Remove-PSSession $ses
}

Invoke-Command -Session $session -ScriptBlock $script -ArgumentList $cred, $cldhost
Remove-PSSession $session

但这总是给我跳转主机而不是云主机的 C:\ 的输出。

在其他论坛上有人建议我使用 credssp 或委托会话。 CredSSP 在这里是不可能的,因为我得到的错误是 SPN 在 AD 帐户中丢失并且我不允许添加一个并且委派的会话对我没有帮助,因为我对 jumphost 和cloudhost 并且不需要委托某些东西。

但无论如何我认为这不是凭据的问题,因为我没有收到 "Access denied" 错误或其他错误,并且输入 pssession 到 jumphost 并从那里 invoke-command 到 cloudhost 工作没有问题,但我不能在脚本中使用它。 嵌套 pssessions 代码的逻辑似乎有问题...

你有什么想法让这个在这里正常工作吗?

委派管理员权限: http://blogs.technet.com/b/heyscriptingguy/archive/2014/04/03/use-delegated-administration-and-proxy-functions.aspx

CredSSP: http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/14/enable-powershell-quot-second-hop-quot-functionality-with-credssp.aspx

非常感谢, 马克

顺便说一句: 我尝试使用 CredSSP,因为建议将其用于第二跳:

Enable-WSManCredSSP -Role Client -DelegateComputer jumphost -Force

$cred = Get-Credential ad\username -Message "Please insert the password for the jumphost and the cloudhost"
$session = New-PSSession -ComputerName jumphost -Credential $cred
Invoke-Command -Session $session -ScriptBlock {Enable-WSManCredSSP -Role Server –Force; Set-Item wsman:\localhost\client\trustedhosts -value localcomputer -Force; Restart-Service winrm -Force}

$session2 = new-PSSession -ComputerName jumphost -Credential $cred -Authentication Credssp

输入最后一条命令后出现以下错误:

The WinRM client cannot 
process the request. A computer policy does not allow the delegation of the user credentials to the target computer because the 
computer is not trusted. The identity of the target computer can be verified if you configure the WSMAN service to use a valid 
certificate using the following command: winrm set winrm/config/service '@{CertificateThumbprint="<thumbprint>"}'  Or you can 
check the Event Viewer for an event that specifies that the following SPN could not be created: WSMAN/<computerFQDN>. If you find 
this event, you can manually create the SPN using setspn.exe .  If the SPN exists, but CredSSP cannot use Kerberos to validate 
the identity of the target computer and you still want to allow the delegation of the user credentials to the target computer, 
use gpedit.msc and look at the following policy: Computer Configuration -> Administrative Templates -> System -> Credentials 
Delegation -> Allow Fresh Credentials with NTLM-only Server Authentication.  Verify that it is enabled and configured with an SPN 
appropriate for the target computer. For example, for a target computer name "myserver.domain.com", the SPN can be one of the 
following: WSMAN/myserver.domain.com or WSMAN/*.domain.com. Try the request again after these changes. Weitere Informationen 
finden Sie im Hilfethema "about_Remote_Troubleshooting".
In Zeile:1 Zeichen:13
+ $session2 = new-PSSession -ComputerName jumphost -Credential $cred -Aut ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotingTransportE 
   xception
    + FullyQualifiedErrorId : -2144108124,PSSessionOpenFailed 

我不知道要进一步激活什么才能使用 CredSSP,无论如何最好让它在没有 CredSSP 的情况下工作。

还可以: 它应该与委托会话一起工作,我尝试了以下方法:

在 Jumphost 上:

Register-PSSessionConfiguration -Name PowerShell.Session -SessionType DefaultRemoteShell -AccessMode Remote -RunAsCredential 'ad\username' -ShowSecurityDescriptorUI –Force

然后授予用户访问权限 'ad\username'(调用和读取访问权限)。 之后,我可以使用以下命令在 jumphost 上使用会话配置:

$cred = Get-Credential ad\username -Message "Please enter the password for jumphost" 

$session = New-PSSession -ConfigurationName PowerShell.Session -ComputerName jumphost -Credential $cred

因此会话已连接,我输入了其他命令:

$cldhost = Read-Host "Please enter the cloudhost name"

$script = {
    Param (
        $Credential,
        $Hostname2
    )
    $ses = New-PSSession -ComputerName $Hostname2 -Credential $Credential
    Invoke-Command -Session $ses -ScriptBlock { Get-ChildItem C:\ }
    Remove-PSSession $ses
}

Invoke-Command -Session $session -ScriptBlock $script -ArgumentList $cred, $cldhost
Remove-PSSession $session

不幸的是,我再次获得了 jumphost 的 Get-ChildItem C:\ 的输出,而不是 cloudhost 的输出... 你有什么进一步的想法吗?是不是 $script{} 部分有问题?

终于成功了:

$cred = Get-Credential ad\username -Message "Please insert the password for the jumphost"

$session = New-PSSession -ComputerName jumphost -Credential $cred

$cldhost = Read-Host "Please insert the cloudhost name"

$script = {
    Param (
        $Credential,
        $Hostname2
    )
    $ses = New-PSSession -ComputerName $Hostname2 -Credential $Credential
    Invoke-Command -Session $ses -ScriptBlock { Get-ChildItem C:\ }
    Remove-PSSession $ses
}

Invoke-Command -Session $session -ScriptBlock $script -ArgumentList $cred, $cldhost
Remove-PSSession $session

这意味着我不需要委托会话或 CredSSP。但无论如何,它也可以通过在跳转主机上手动设置委托配置,然后在弹出窗口中添加应该能够连接到会话配置的用户 -ShowSecurityDescriptorUI 并删除默认用户 "interactive user" 和本地管理员:

Register-PSSessionConfiguration -Name PowerShell.Session -SessionType DefaultRemoteShell -AccessMode Remote -RunAsCredential 'ad\username' -ShowSecurityDescriptorUI –Force

如果您现在使用上面指定的用户连接到会话配置,命令将在您在 -RunAsCredential.

下指定的用户的上下文中执行

它也可以直接从本地主机工作,但是你必须使用 -SecurityDescriptorSddl,这需要一个函数来删除会话配置的默认凭据并添加新的自动使用 ACL 的凭据...意味着大量工作。

非常感谢您的帮助!

马克