Назад | Перейти на главную страницу

Почему администратор домена может запускать командную оболочку PowerShell локально, но при подключении через WinRM с той же учетной записью команда возвращает исключение UnauthorizedAccessException?

Я пытаюсь удаленно администрировать машину с 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 имеет значение «Unrestricted», и эта команда отлично работает, когда я использую локальный сеанс PowerShell на удаленном компьютере.

Есть ли другой контекст безопасности для удаленных сеансов PowerShell?

редактировать: конкретная строка, в которой он не работает, это одна:

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

API Центра обновления Windows особенный. Он специально проверяет и запрещает удаленный доступ, проверяя, помечен ли ваш токен как удаленный. Не знаю, почему так написано.

Я закончил тем, что создал запланированную задачу и вызвал внутри нее API обновления Windows - довольно неприятно.

В зависимости от того, как именно командлет Get-WURebootStatus получает доступ к информации, я думаю, это может быть связано с проблемой «второго прыжка» в 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 по той же причине.

Решение (как представлено в статье блога) состоит в том, чтобы включить и использовать CredSSP в качестве механизма аутентификации при создании сеанса PSSession.

Вы также можете заключить команду в запланированную задачу и сразу же запустить ее, но это большая дополнительная работа, которая может быть ненужной.

Попробуйте использовать Get-WURebootStatus -ComputerName <your remote computer> -Silent.