您是否曾嘗試在 PowerShell Remoting 會話中訪問遠程資源,卻在訪問被拒絕時遇到挫折?這個常見問題被稱為“雙跳問題”,阻止您從當前會話訪問第二台遠程計算機。
好消息是?有方法可以解決雙跳問題,而不需要過於複雜的配置。在本教程中,您將構建一個自定義會話,無縫處理身份驗證,省時省力同時保持安全性。
克服雙跳問題,並通過會話配置來優化您的工作流程!
以不同用戶身份運行 PowerShell
如果您正在處理連接到遠程資源的腳本,可能會遇到雙跳問題。當您的憑證無法在遠程連接的第一跳以外進行身份驗證時,就會出現此問題。
例如,考慮一個使用 UNC 路徑在遠程計算機上計算子目錄數的腳本:
(Get-ChildItem -Path \\SRV2\c$ -Directory).Count
如果您以權限不足以訪問資源的用戶登錄,可以使用不同的用戶帳戶運行 PowerShell:
- 在“開始”菜單中搜索 PowerShell。
- 右擊 PowerShell 快捷方式,並選擇打開檔案位置。
- 在文件總管中,按住 Shift,右擊快捷方式,並選擇以不同的使用者身份執行。
- 輸入具有必要權限的使用者的憑證。
在以不同用戶身份啟動 PowerShell 後,命令現在應該成功執行:
(Get-ChildItem -Path \\SRV2\c$ -Directory).Count
提示:如果您经常以不同凭据运行命令,请考虑使用Start-Process
命令,带有-Credential
参数。这种方法允许您直接从控制台使用替代凭据打开新的PowerShell会话。
测试远程连接
当您在使用多个远程系统时,可能会成功地在本地访问远程资源,比如共享文件夹。但是当您在第二台远程计算机上执行相同的命令时,却发现会产生“访问被拒绝”的错误。
这种不一致性可能会让人感到困惑,尤其是当您确信自己的凭据具有足够的权限时。
为了测试您的远程连接,请与另一台计算机建立一个会话:
Enter-PSSession -ComputerName SRV3
连接后,在第二台计算机上尝试运行相同的命令:
(Get-ChildItem -Path \\SRV2\c$ -Directory).Count
即使您使用具有权限的帐户,此测试通常会导致“访问被拒绝”的错误。
请使用以下方法确认您当前的用户:
whoami
这种行为(双跳)发生是因为PowerShell不会将您的凭据传递到下一跳。这种机制是内置在Kerberos身份验证中的安全功能,但在管理多个系统时可能会带来很大麻烦。
通过会话配置解决双跳问题
解决双跳问题的一种方法是在中间计算机上创建一个会话配置。
首先在您要连接的计算机(在本例中为SRV3)上注册一个会话配置。
以下命令:
- 將一個
Name
指定給會話配置(例如,Admin
)。 - 指定帳戶(
RunAsCredential
)會話將在其下運行。 - 確保(
Force
)應用配置並重新啟動WinRM服務。
Invoke-Command -ComputerName SRV3 -ScriptBlock { Register-PSSessionConfiguration -Name Admin -RunAsCredential 'psforsysadmins.local\adam' -Force }
PowerShell提示您輸入RunAsCredential
帳戶的密碼,該密碼安全地存儲在遠程機器上。一旦配置註冊完成,WinRM服務將重新啟動並關閉會話。
配置就位後,您現在可以使用ConfigurationName
參數進行連接:
Invoke-Command -ComputerName SRV3 -ScriptBlock { (Get-ChildItem -Path \\SRV2\c$ -Directory).Count } -ConfigurationName Admin
此命令執行與之前相同的操作。但是,它指定運行在指定管理員帳戶下的Admin
會話配置。
提示: 使用Set-PSSessionConfiguration
cmdlet定義用戶或組特定的訪問權限,限制對會話配置的訪問。這樣做可以確保只有授權的用戶可以利用該配置。
結論
在本指南中,您已經了解並解決了PowerShell遠程的雙跳問題。設置會話配置可以解決雙跳問題,確保憑證安全傳遞。
這個解決方案是持久的,因此您可以在重新啟動後再次使用配置,這使其成為管理遠程PowerShell會話的堅固方法。現在,您可以自信地管理多跳遠程操作,並在不影響安全性的情況下優化工作流程。
從這裡開始,考慮探索進階安全選項,例如限制會話訪問或實施基於憑證的身份驗證。這些增強功能可以進一步加強您的遠程設置,同時靈活管理複雜環境。
Source:
https://adamtheautomator.com/powershell-double-hop-fix/