Скрипт Powershell со встроенным exe - PullRequest
0 голосов
/ 16 апреля 2020

Есть ли способ встроить exe в существующий скрипт powershell? Мой начальник хочет, чтобы я нашел способ установки программного обеспечения на компьютеры наших сотрудников, которые работают из дома и не разбираются в технологиях. По сути, мне нужно скопировать файл локально на их компьютер (который является исполняемым) и запустить его из терминала powershell (или командной строки) с некоторыми аргументами (например, / norestart / quiet, et c).

1 Ответ

0 голосов
/ 17 апреля 2020

Вы можете использовать кодировку Base64 для встраивания exe в сценарий PowerShell. Запустите этот скрипт для кодирования исполняемого файла. Он создает файл base64Decoder.ps1 в папке «Загрузки».

# Requires PowerShell 5.1 
# Run this script to encode the exe. 
# It produces 'base64Decoder.ps1' in the Downloads folder. 

$folder = "$env:UserProfile\Downloads\Demo\"
$file = "PowerShell-7.0.0-win-x64.msi"

$option = [System.Base64FormattingOptions]::InsertLineBreaks
$path = Join-Path -Path $folder -ChildPath $file
$bytes = Get-Content $path -Encoding Byte -ReadCount 0

$outputProgram = [System.Text.StringBuilder]::new()

[void]$outputProgram.AppendLine( '$encodedText = @"' )
[void]$outputProgram.AppendLine( ([Convert]::ToBase64String($bytes, $option)) )
[void]$outputProgram.AppendLine( '"@' )
[void]$outputProgram.Append(
@"

`$downloads = Join-Path -Path `$Env:USERPROFILE -ChildPath "Downloads"
`$file = "$file"
`$path = Join-Path -Path `$downloads -ChildPath `$file
`$value = [System.Convert]::FromBase64String(`$encodedText)

Set-Content -Path `$path -Value `$value -Encoding Byte
"@
)

$downloads = Join-Path -Path $Env:USERPROFILE -ChildPath "Downloads"
$outFile = "base64Decoder.ps1"
$outPath = Join-Path -Path $downloads -ChildPath $outFile

Set-Content -Path $outPath -Value ($outputProgram.ToString())

Вы можете скопировать и вставить содержимое base64Decoder.ps1 в существующий сценарий PowerShell, чтобы встроить исполняемый файл. Или, если он слишком большой, включите base64Decoder.ps1 с исходным сценарием и вызывайте его при необходимости.

Запустите сценарий на целевом компьютере, чтобы воспроизвести исходный файл в папке «Загрузки». Это допустимый синтаксис PowerShell и может быть включен в сценарий.

& "$env:UserProfile\Downloads\base64Decoder.ps1"

Возможно, вам придется установить политику выполнения до запуска сценария.

Set-ExecutionPolicy RemoteSigned

Вызов exe с помощью Start-Process . Это может быть сохранено в сценарии.

Start-Process -FilePath "$env:UserProfile\Downloads\PowerShell-7.0.0-win-x64.msi" -ArgumentList '/? '

Если вы хотите отправить сценарий PowerShell по электронной почте, прикрепите его как .txt и попросите переименовать его. Я уверен, что вы знаете, что вложения файлов обычно ограничены 10 МБ.

Если exe доступен онлайн, вы можете использовать Invoke-WebRequest , что намного проще.

Invoke-WebRequest "https://github.com/PowerShell/PowerShell/releases/download/v7.0.0/PowerShell-7.0.0-win-x64.msi" -outfile "$env:UserProfile\Downloads\PowerShell-7.0.0-win-x64.msi"

Вы можете проверить эти шаги в Windows Песочница .

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

Во-первых, это сложнее, чем просто загрузить установщик из Inte rnet и использовать ( MSI ) его переключатели.

Во-вторых, производительность моего скрипта плоха для нетривиальных exe-файлов. И создаст больше проблем, чем решит .

Я не уверен, что предположение здесь. Но если эти компьютеры не управляются, я предполагаю, что будет запрос поддержки для каждой установки. То, что вы не сможете сделать, это просто отправить этот сценарий по электронной почте 100 людям или поместить его в сценарий входа в систему и уйти. Это было бы очень плохо . Даже если бы это было в офисе, я бы не развернул автоматическую установку без тщательного тестирования. И это при условии локального хранилища и сценария входа в систему или эквивалентного: не люди, работающие из дома как разовые.

...