Доступ запрещен при запуске Центра обновления Windows с помощью Powershell Invoke-Command

Я пытался настроить модуль Powershell, который удаленно вызывал бы обновление Windows/Microsoft на сервере с помощью Invoke-Command, затем обрабатывал обновления и отправлял все обратно на вызывающий сервер, чтобы он мог отправить отчет по электронной почте.

Моя проблема возникает, когда я пытаюсь вызвать загрузчик: Powershell, похоже, запрашивает повышенные права на удаленном компьютере.

Вот фрагмент того, что я пытаюсь запустить и терплю неудачу:

Invoke-Command -ComputerName $Server -Credential $Credentials -ScriptBlock {
    $UpdateSession = New-Object -ComObject "Microsoft.Update.Session"
    Write-Progress -Activity "Updating" -Status "Checking for new updates"
    $Criteria = "IsInstalled=0 and Type='Software'"
    $Updates = $UpdateSession.CreateUpdateSearcher().Search($Criteria).updates
    $Downloader = $UpdateSession.CreateUpdateDownloader()
    $Downloader.Updates = $Updates
}

Я знаю, что проблема не в удаленном взаимодействии, так как первые 4 команды работают нормально. Переменная $Credentials указывает на предварительно определенные учетные данные, которые являются локальным администратором на удаленном сервере.

Когда скрипт доходит до 5-й строки, $Downloader = $UpdateSession.CreateUpdateDownloader(), я получаю эту ошибку от Powershell:

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
    + CategoryInfo          : OperationStopped: (:) [], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException
    + PSComputerName        : SERVER.sidlee.inc

Что именно может быть причиной этого?

Заранее спасибо за помощь!


person Alex Pilon    schedule 28.09.2017    source источник
comment
Если я правильно помню, для большинства методов Windows Update и Microsoft Installer требуются локальные и интерактивные сеансы. Одним из обходных путей является настройка задачи планировщика заданий для немедленного запуска.   -  person BenH    schedule 28.09.2017
comment
Если это так, то это было бы очень хреново, потому что это в основном то, что я изначально сделал. У меня был массивный скрипт, который запускал все (запуск обновления Windows, создание отчетов, отправка их по электронной почте через другой сервер и т. д.), но я хотел, чтобы все работало с одного сервера через модуль Powershell.   -  person Alex Pilon    schedule 28.09.2017
comment
Отвечает ли это на ваш вопрос? Powershell Remote: Microsoft.Update.Session, доступ запрещен: 0x80070005   -  person argonym    schedule 03.02.2020


Ответы (1)


Поскольку я только что наткнулся на ту же стену, и Google тоже не очень помог, вот что я мог выкопать.

Для справки, я делаю почти то же самое (использую собственный код PS для проверки удаленных систем на наличие обновлений Windows), но использую WinRM поверх Python вместо Invoke-Command, а также застреваю на Microsoft.Update.Searcher.Search(), выдавая ошибку E_ACCESSDENIED.

UnauthorizedAccessException действительно не связано с Powershell, а с базовым API.

Я подозреваю, что Microsoft начала отключать олицетворение в удаленном сеансе в каком-то недавнем обновлении (Powershell v5?), поскольку это прекрасно работало (и работает до сих пор) в более старых версиях Windows (например, Server 2012 с Powershell v3 или 2012 R2 с v4)

Чтобы обойти это, вам нужно пройти аутентификацию (на удаленном сервере) перед выполнением ваших действий с объектом PSCredential.

Итак, Remote Auth -> Local Auth -> Run stuff например, используя Start-Process -Credential ...

e.g.

$pass = ConvertTo-SecureString "PA$$W0RD" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential "User", $pass
Start-Process -Credential $creds powershell -ArgumentList "-Command & { ... whatever you want to do ... }"

Имейте в виду, что это представляет угрозу безопасности, поскольку ваш пароль будет проанализирован в виде открытого текста, поэтому не делайте этого по незашифрованному каналу!

person user1972814    schedule 14.02.2018