Прежде чем я углублюсь в вопрос, я нашел несколько других вопросов, которые кажутся мне похожими на мои, но они не смогли решить мою проблему. Вот ссылки на них:
Удаленно запустить сценарий, вызывающий «Запуск от имени администратора»
Теперь к вопросу: мне нужно запустить скрипт Windows Update на удаленном компьютере через Powershell. Если я удаленно подключился к машине через mstsc, запустил Powershell от имени администратора и запустил скрипт Windows Update, все будет нормально. Если я удаленно подключусь к машине через mstsc, запустите Powershell БЕЗ выбора запуска от имени администратора и запустите сценарий, я получу кучу ошибок в этой строке: «Исключение, вызывающее« Загрузить »с аргументом (-ами) 0»: Исключение из HRESULT: 0x80240044 ""
Это происходит только в том случае, если я запускаю его БЕЗ прав администратора.
Скрипт, который я запускаю, таков: http://www.ehow.com/how_8724332_use-powershell-run-windows-updates.html
Теперь, когда я подключаюсь к машине с помощью Enter-PSSession и пытаюсь запустить сценарий, я получаю ошибки, но они немного другие. Они находятся в этой строке: «Исключение, вызывающее« CreateUpdateDownloader »с аргументом (ами)« 0 »:« Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)) ""
Я открыт для предложений относительно того, что могло вызвать эту проблему, но я думаю, что я понял это. Я считаю, что сеанс Powershell необходимо запускать с повышенными привилегиями. Я знаю, как это сделать при удаленном подключении через mstsc, но мне не удалось найти способ сделать это через Enter-PSSession. Я гуглил и гуглил, но ничего не нашел. Если бы кто-нибудь мог помочь пролить свет на это, мы были бы очень признательны.
Когда вы выполняете команды удаленно, они запускаются с правами администратора, потому что только администраторам разрешено удаленно выполнять команды в PowerShell. Ошибка: «Исключение вызывает CreateUpdateDownloader» с аргументом (ами) «0»: «Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)) "" не является собственной ошибкой PowerShell, это означает, что эта строка не работает: $ UpdatesDownloader = $ UpdateSession.CreateUpdateDownloader (), эта строка пытается создать обновленный объект загрузчика с помощью $ UpdateSession = New-Object -ComObject Объект Microsoft.Update.Session.
Не зная, ГДЕ пытается связаться загрузчик, я могу только предположить, что это материнский корабль, он может указывать на то, что учетные данные, которые у вас есть при удаленном подключении к серверу, могут быть предметом прокси. Это обычная практика безопасности, пользователи, удаленно подключенные к машинам, не могут загружать элементы непосредственно из Интернета (независимо от того, насколько надежен источник).
Надеюсь, это поможет, Крис
Чтобы запускать удаленные команды PowerShell, вам НЕОБХОДИМО запускать от имени администратора машину, с которой вы запускаете команды, по крайней мере, в готовой конфигурации. Это задокументированное ограничение удаленного взаимодействия PowerShell, хотя можно ослабить значения по умолчанию, если вы определитесь, но это потребует внесения изменений в конфигурацию PowerShell.
Для удаленного выполнения вы передаете учетные данные с помощью параметра -credentials? например
Enter-PSSession -Credential(Get-Credential) -ComputerName <remotehost>
http://msdn.microsoft.com/en-us/library/windows/desktop/aa387288(v=vs.85).aspx
Это не позволяет вам вызывать его удаленно.
Вот в чем причина. Вы можете сделать это с помощью запланированного задания.
Что касается обновлений Windows на удаленных серверах, мне удалось заставить его работать, настроив конечную точку JEA на удаленном сервере для работы в качестве локальной виртуальной учетной записи.
Из https://docs.microsoft.com/en-us/powershell/scripting/learn/remoting/jea/session-configurations:
Локальная виртуальная учетная запись
Если все роли, поддерживаемые этой конечной точкой JEA, используются для управления локальным компьютером, а для успешного выполнения команд достаточно учетной записи локального администратора, вам следует настроить JEA для использования локальной виртуальной учетной записи. Виртуальные учетные записи - это временные учетные записи, которые уникальны для конкретного пользователя и действуют только на время его сеанса PowerShell. На рядовом сервере или рабочей станции виртуальные учетные записи принадлежат локальному компьютеру. Администраторы group и имеют доступ к большинству системных ресурсов. На контроллере домена Active Directory виртуальные учетные записи принадлежат к группе администраторов домена.
(1.) Создайте новую неограниченную (и постоянную!) Конфигурацию сеанса на ComputerB (удаленном сервере):
New-PSSessionConfigurationFile -RunAsVirtualAccount -Path .\VirtualAccount.pssc
# Note this will restart the WinRM service:
Register-PSSessionConfiguration -Name 'VirtualAccount' [-ShowSecurityDescriptorUI] -Path .\VirtualAccount.pssc -Force
# Check the Permission property:
Get-PSSessionConfiguration -Name 'VirtualAccount'
# Those users will have full unrestricted access to the system!
(2.) С компьютера A (локальный клиент) подключитесь к конфигурации неограниченного сеанса на компьютере B:
New-PSSession -ComputerName 'ComputerB' -ConfigurationName 'VirtualAccount' | Enter-PSSession
[ComputerB]: new-object -com "Microsoft.Update.Downloader" # Yay!
¹ скопировано из https://stackoverflow.com/a/60046097/1322112
Надежным решением этой проблемы является создание запланированной задачи на целевых серверах, которая будет запускать powershell.exe с такими аргументами:
-ExecutionPolicy ByPass -Command "c:\scripts\myscript.ps1" param1 param2
установите задачу «запускать с наивысшими привилегиями» и как СИСТЕМУ, если вам не требуется сценарий для доступа к сети. Если да, вам, вероятно, придется использовать какую-то специальную учетную запись службы. Затем запустите задачу удаленно на нескольких хостах, например, так
foreach($srv in $servers){
$res=schtasks /s $srv /tn "taskname" /run 2>&1
if($res -like "*SUCCESS*"){
write-host "task started" -ForegroundColor cyan
}
}
Вы можете создать запланированную задачу один раз, затем экспортировать ее в виде XML-файла и массово развернуть на многих серверах с помощью такой команды
schtasks /s $hostname /create /tn mytaskname /ru system /f /xml c:\temp\mytask-schtask.xml