У меня есть сеть с серверами 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.
Как он узнал, что я на удаленном компьютере?
Ответы:
Вы просто не можете сделать это, приятель, потому что MS не позволяет вам делать это через WUApi.
Подробности можно найти здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/aa387288(v=vs.85).aspx
Вы можете попробовать использовать запланированное задание, чтобы сделать это.
источник
Такая команда должна выполняться с привилегиями на удаленном компьютере, откуда необходимо запускать от имени администратора домена или администратора на удаленном компьютере.
Если у вас первый случай, мне не поможет, но вы только локальный администратор, а не удаленный, используйте
get-credential
вот так.Альтернативная и более прямая форма позволяет
Invoke-Command
запрашивать учетные данные:источник
Я смог заставить это работать, настроив конечную точку JEA на удаленном сервере для запуска в качестве локальной виртуальной учетной записи.
С https://docs.microsoft.com/en-us/powershell/jea/session-configurations :
источник