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

Проблемы с удаленной установкой исправлений на серверах с помощью WinRM и Microsoft.Update.Session

У меня есть сеть с серверами windows 2003, 2008 и 2008r2. У меня есть сценарий PowerShell, который я написал для исправления локального компьютера с помощью com-объектов Microsoft.Update. (Похожий на Удаленное взаимодействие PowerShell Центра обновления Windows.) Мой сценарий прекрасно работает локально, но я бы хотел использовать его функции удаленно, так как мне нужно управлять большим количеством серверов. В этом случае он падает (как и тот другой пост, который не решен).

Однако я смог сузить ошибку до двух методов в конкретном классе.

(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateDownloader()
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateInstaller()

Если вы запустите их в PowerShell локально в качестве администратора, у вас не будет проблем. Если вы попытаетесь использовать команду invoke (или enter-session, или winrs), вы получите следующую ошибку. (Это тестирование с помощью localhost, но подойдет любой хост. Я также пробовал использовать разные методы аутентификации, такие как credssp и kerberos.);

PS C:\> Invoke-Command -ComputerName localhost -ScriptBlock { (New-Object -ComObject "microsoft.update.session").createUpdateDownloader()}
Exception calling "CreateUpdateDownloader" with "0" argument(s): "Access is denied. (Exception from HRESULT: 0x80070005
 (E_ACCESSDENIED))"
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

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

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

я нашел некоторые документы это объясняет сообщение, но не причину или обходной путь.

Возвращаемое значение В случае успеха возвращает S_OK. В противном случае возвращает код ошибки COM или Windows.

This method can also return the following error codes.
Return code   Description
E_INVALIDARGA parameter value is invalid. 
E_ACCESSDENIED    This method cannot be called from a remote computer.

Как он узнает, что я нахожусь на удаленном компьютере?

Вы просто не можете сделать это, товарищ, потому что MS не позволяет вам делать это через WUApi.

Подробности можно найти здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/aa387288(v=vs.85).aspx

Вы можете попробовать использовать запланированное задание, чтобы сделать это.

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

Из https://docs.microsoft.com/en-us/powershell/jea/session-configurations:

Локальная виртуальная учетная запись

Если все роли, поддерживаемые этой конечной точкой JEA, используются для управления локальным компьютером, а для успешного выполнения команд достаточно учетной записи локального администратора, вам следует настроить JEA для использования локальной виртуальной учетной записи. Виртуальные учетные записи - это временные учетные записи, которые уникальны для конкретного пользователя и действуют только на время его сеанса PowerShell. На рядовом сервере или рабочей станции виртуальные учетные записи принадлежат локальному компьютеру. Администраторы group и имеют доступ к большинству системных ресурсов. На контроллере домена Active Directory виртуальные учетные записи принадлежат к группе администраторов домена.

Такую команду необходимо запускать с привилегиями на удаленной машине, поэтому ее необходимо запускать от имени администратора домена или администратора на удаленной машине.

Если ваш первый случай, у меня нет помощи, но вы только локальный администратор, а не удаленный, используйте get-credential как это.

$cred = get-credential

Invoke-Command -ComputerName localhost -credential $cred -scriptblock {}

Допускается альтернативная и более прямая форма Invoke-Command спросить учетные данные:

Invoke-Command -scriptblock {$ENV:username} -Credential ""