У меня есть сеть с серверами 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 ""