Powershell

為什麼域管理員可以在本地執行 powershell cmd,但使用相同帳戶通過 WinRM 連接,命令返回 UnauthorizedAccessException?

  • December 8, 2020

我正在嘗試遠端管理 Windows 7 機器。我已經啟用了 WinRM 並且可以Enter-PsSession用來連接到遠端機器。

但是,我注意到在本地執行特定命令與遠端執行之間存在差異,即使我使用相同的使用者帳戶(即域管理員)進行連接。

遠端會話的輸出是:

> enter-pssession -computername  REMOTEHOST
[REMOTEHOST} > Get-WURebootStatus
New-Object : Creating an instance of the COM component with CLSID {C01B9BA0-BEA7-41BA-B604-D0A36F469133} from the IClassFactory failed due to the following error: 80070005.
At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\pswindowsupdate\Get-WURebootStatus.ps1:52 char:33
+             $objSystemInfo= New-Object <<<<  -ComObject "Microsoft.Update.SystemInfo"
+ CategoryInfo          : NotSpecified: (:) [New-Object], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.NewObjectCommand

ExecutionPolicy 設置為“無限制”,當我在遠端電腦上使用本地 powershell 會話時,此命令效果很好。

遠端 PowerShell 會話是否有不同的安全上下文?

編輯:它失敗的特定行是這一行:

$objSystemInfo= New-Object -ComObject "Microsoft.Update.SystemInfo"

Windows 更新 API 很特別。它通過檢查您的令牌是否標記為遠端來專門檢查和禁止遠端訪問。我不知道為什麼會這樣寫。

我最終創建了一個計劃任務並在其中呼叫 Windows 更新 API - 相當麻煩。

根據 Get-WURebootStatus cmdlet 訪問其資訊的確切方式,我認為這可能與 PowerShell 中的“第二跳”問題有關。

當您進入遠端 PowerShell 會話時,您要求 WinRM 使用您的憑據在遠端主機上創建會話。如果在同一個會話中,您嘗試訪問需要這些憑據的另一個(遠端)系統或服務,則請求將失敗,因為遠端電腦無權使用您的憑據進行其他任何身份驗證。“嘿,腳本專家!” 部落格很好地解釋了這一點:

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

出於同樣的原因,在遠端連接到一台機器然後嘗試使用 Test-Path 訪問另一台遠端機器共享路徑時,您會看到相同(或類似)的問題。

解決方案(如部落格文章中所述)是在創建 PSSession 時啟用並使用 CredSSP 作為身份驗證機制。

您還可以將命令包裝在計劃任務中並立即執行,但這可能是不必要的大量額外工作。

引用自:https://serverfault.com/questions/493170