Сценарий Powershell / пакетного удаления работает локально, но не при использовании invoke-command - PullRequest
1 голос
/ 10 апреля 2019

У меня есть скрипт, который устанавливает .exe с некоторыми аргументами удаленно на список серверов, который работает нормально. Когда я пытаюсь сделать почти то же самое, но запускаю uninstall.exe, который устанавливается в C: \ Program Files (x86) \, он не работает.

Когда я запускаю сценарии на сервере локально, начинается удаление. Когда я пытаюсь запустить точно такой же сценарий или команду с помощью powershell invoke-command , это не сработает.

$serverlist = Get-Content -Path C:\NagiosInstall\test.txt

ForEach ($server in $serverlist) {

New-Item -Path "\\$server\C$\" -Name "NagiosInstall" -Force -ItemType "directory"
Copy C:\NagiosInstall\ncpa-2.1.6.exe \\$server\C$\NagiosInstall\ncpa-2.1.6.exe
Copy C:\NagiosInstall\install.bat \\$server\C$\NagiosInstall\install.bat

invoke-command -ComputerName $server -ScriptBlock {C:\NagiosInstall\install.bat}

Start-Sleep -s 15
invoke-Command -ComputerName $server -ScriptBlock {Remove-Item -LiteralPath "C:\NagiosInstall" -Force -Recurse}

}

Установка .bat - это простая команда для автоматической установки ncpa-2.1.6.exe.

Выше мой скрипт установки, эта часть все работает нормально.

invoke-command -ComputerName $server -ScriptBlock {Start-Process -FilePath "C:\Program Files (x86)\Nagios\NCPA\uninstall.exe" -ArgumentList "/S"}

Запустив указанную выше команду, ничего не происходит. Нет ошибок, ничего.

& "C:\Program Files (x86)\Nagios\NCPA\uninstall.exe" -ArgumentList "/S"

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

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

Я предполагаю, что это связано с invoke-command или с тем фактом, что она находится в C: \ Program Files (x86), что может сделать синтаксис другим, но я пробовал много вещей и у меня нет идей кроме создания аккаунта и публикации здесь.

1 Ответ

0 голосов
/ 10 апреля 2019

Проблема в том, что Invoke-Command работает не в интерактивном режиме и поэтому не может работать от имени администратора и отвечать на приглашение UAC.

Единственный обходной путь - подключиться к компьютеру через сеанс PSSession с учетными данными и выполнить его следующим образом:

$Cred = Get-Credential
$Session = New-PSSession -ComputerName $server -Credential $Cred
Invoke-Command -Session $Session -ScriptBlock {Start-Process -FilePath "C:\Program Files (x86)\Nagios\NCPA\uninstall.exe" -ArgumentList "/S"}
$Session | Exit-PSSession

Edit:

Причина, по которой работает установщик, заключается в том, что запрос UAC для установок Windows отличается от всего, что есть в Windows, см. Как отключить запрос UAC для пакетов MSI для компьютеров для не-администраторов или Использование установщика Windows с UAC .

По сути, установщик Windows (уже запущенный с правами администратора и UAC) запускает установку от вашего имени, и это Установщик Windows и параметры установщика, определяющие необходимость просмотра приглашения UAC. или нет. Следовательно, именно поэтому установка работает. Установщик Windows определил, что вам не нужно видеть приглашение UAC, и установка продолжается.

Удаление отличается. Поскольку вы используете uninstall.exe, исполняемый файл нуждается в административном доступе, и Windows выполнит UAC до того, как uninstall.exe даже запустится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...