Проблемы с удаленным исправлением серверов с использованием winrm и Microsoft.Update.Session

10

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

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

(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

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

  • Используйте psexec для запуска команд от имени пользователя системы. PSExec - это то, что я пытаюсь не использовать, поскольку оно оказалось ненадежным. Я также хотел бы чистого решения PowerShell.
  • Создайте запланированное задание и скажите, что запускаете ваш скрипт как системный пользователь. (через его пост ) Это не только грязно, но у меня не будет результатов обновления. Мне придется войти в файл или обновить базу данных или что-то.

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

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

Возвращаемое значение Возвращает 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.

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

reconbot
источник
Это кажется намного сложнее, чем поддерживать экземпляр WSUS и идти по этому пути. Вы рассматривали этот маршрут?
Driftpeasant
Вы не можете точно контролировать, когда сервер будет выкуплен, и убедитесь, что он вернется только с WSUS. Мы используем его для самих обновлений. Мне было бы интересно, если бы вы могли активировать его по требованию.
перепроверить
У меня та же проблема с использованием PowerShell Web Access на Server 2012, за кулисами также используется удаленное взаимодействие PowerShell. Та же ошибка.
Питер Хандорф
1
Возможный ответ здесь serverfault.com/a/474031/23300
Ник
@reconbot Я знаю, это очень старый вопрос, но я также сталкиваюсь с проблемой. Вы получили какое-нибудь исправление или альтернативный способ?
Счетная машина

Ответы:

6

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

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

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

река
источник
0

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

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

$cred = get-credential

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

Альтернативная и более прямая форма позволяет Invoke-Commandзапрашивать учетные данные:

Invoke-Command -scriptblock {$ENV:username} -Credential ""
motobói
источник
Я работаю с учетными данными администратора, ошибка указывает «Этот метод не может быть вызван с удаленного компьютера».
Реконбот
0

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

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

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

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

jsmitty
источник