設定 PowerShell 的 Credential Delegation

看來 PowerShell 若不設定 Credential Delegation 無法在遠端存取共享資源…

從 N1 透過 PowerShell 遠端登入到 N3,並要求 N3 存取共享資源,會有因為沒有身分而授權失敗的錯誤:

image

範例語法:

PS C:\Users\administrator.I> Enter-PSSession -ComputerName n3

[n3]: PS C:\Users\administrator.I\Documents> dir \\n1\logs
dir : 存取被拒。
    + CategoryInfo          : PermissionDenied: (\\n1\logs:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
 
dir : 找不到 ‘\\n1\logs’ 路徑,因為它不存在。
    + CategoryInfo          : ObjectNotFound: (\\n1\logs:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

參考 https://rkeithhill.wordpress.com/2009/05/02/powershell-v2-remoting-on-workgroup-joined-computers-%E2%80%93-yes-it-can-be-done/ 設定 Credential Delegation

  • 因為要連到 N3,所以 N3 現在扮演 Server,在 N3 以系統管理員身分執行 Enable-WSManCredSSP -Role Server

image

  • 在 Client,也就是 N1 執行 Enable-WSManCredSSP -Role Client -DelegateComputer n3

image

沒有做文中的群組原則設定,已經可以存取:

image

不知是否是測試用的機器在 Domain 內,可以走 Kerberos 而非 NTLM

image

 

在測通之後,嘗試透過以下的語法,從 n1 發起,一次存取 n1,n2,n3 的 log,放回到 \\n1\logs 共享目錄:

$ScriptPath=($MyInvocation.MyCommand.Path | Split-Path) + "\"
$cred=New-Object System.Management.Automation.PSCredential  (Get-Content ($ScriptPath + "id.txt")),(ConvertTo-SecureString (Get-Content ($ScriptPath + "pwd.txt")) -AsPlainText -Force)

Invoke-Command -ComputerName (Get-Content ( $ScriptPath + "ServerName.txt")) `
-FilePath ($ScriptPath + "GetMultiServerSQLInstanceProperties.ps1") `
-Credential $cred -Authentication Credssp

得到如下的錯誤:

[N1] 連線到遠端伺服器 N1 失敗,傳回下列錯誤訊息: WinRM 用戶端無法處理該要求。電腦原則不允許委派使用者認證至目標電腦。 請使用 gpedit.msc 並查看下列原則: 電腦設定 -> 系統管理範本 -> 系統 -> 認證委派 -> 允許委派新認證。 請確認已啟用該原則且設定適合目標電腦的 SPN。 例如,目標電腦名稱若為 "myserver.domain.com
",SPN 可為下列其中之一: WSMAN/myserver.domain.com 或 WSMAN/*.domain.com。 如需詳細資訊,請參閱 about_Remote_Troubleshooting 說明主題。
    + CategoryInfo          : OpenError: (N1:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : -2144108125,PSSessionStateBroken
[N2] 連線到遠端伺服器 N2 失敗,傳回下列錯誤訊息: WinRM 用戶端無法處理該要求。電腦原則不允許委派使用者認證至目標電腦。 請使用 gpedit.msc 並查看下列原則: 電腦設定 -> 系統管理範本 -> 系統 -> 認證委派 -> 允許委派新認證。 請確認已啟用該原則且設定適合目標電腦的 SPN。 例如,目標電腦名稱若為 "myserver.domain.com
",SPN 可為下列其中之一: WSMAN/myserver.domain.com 或 WSMAN/*.domain.com。 如需詳細資訊,請參閱 about_Remote_Troubleshooting 說明主題。
    + CategoryInfo          : OpenError: (N2:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : -2144108125,PSSessionStateBroken

可以理解,因為 Enable-WSManCredSSP -Role Client -DelegateComputer n3 執行時,並未有包含 n1,n2,但再度執行 Enable-WSManCredSSP -Role Client -DelegateComputer n3,n1,n2 依然有如上的錯誤

所以直接透過本機群組原則編輯器加入:

image

image

image

image

 

若在 N2 未以系統管理員身分執行 Enable-WSManCredSSP -Role Server,依然會有相同錯誤訊息

但 n1 自己對自己永遠失敗,改以 SPN 才行:

image

image

換句話說,n1 連 n1 自己,要用 n1.i.com (我的 domain 取 i.com)

參考資源:

https://technet.microsoft.com/en-us/magazine/jj853299.aspx

http://www.ravichaganti.com/blog/wp-content/uploads/2010/12/A%20layman’s%20guide%20to%20PowerShell%202.0%20remoting-v2.pdf

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: