Заметки о Windows и других программных продуктах Microsoft...

Как сконвертировать PowerShell в EXE

Как сконвертировать PowerShell в EXE

Сконвертировать скрипт PowerShell в исполняемый exe-файл можно с помощью PS2EXE-GUI. Этот конвертер основан на скрипте PS2EXE, к которому добавлена графическая оболочка.

У скрипта имеется большое количество дополнительных опций, поэтому начать лучше со справки. Для ее вывода надо запустить скрипт ps2exe.ps1 без параметров.

справка ps2exe

 

В самом простом варианте конвертации запускаем ps2exe.ps1 и указываем ему в качестве параметров входной и выходной файлы. Для примера возьмем простой скрипт, выводящий сообщение на экран, сконвертируем его и проверим результат:

.\ps2exe.ps1 -inputFile script.ps1 -outputFile script.exe

конвертация из консоли PowerShell

 

По умолчанию выходной файл создается как консольное приложение. Если указать ключ noConsole, то файл скомпилируется как Windows приложение:

.\ps2exe.ps1 -inputFile script.ps1 -outputFile script.exe -noConsole

ключ -NoConsole

 

Сгенерированный exe-файл поддерживает несколько дополнительных параметров. К примеру, запущенный с параметром -wait он после выполнения не завершится, а будет ожидать реакции пользователя.

ключ -wait

 

Те, кто не любит работать в консоли, могут воспользоваться графической оболочкой. Принцип здесь тот же, указываем входной и выходной файл, и отмечаем дополнительные опции. Кстати, в отличии от оригинального PS2EXE в GUI есть пара новых параметров.

ps2exe GUI

 

Обратите внимание, что при конвертации не происходит преобразования скрипта в другой язык программирования, просто скрипт заворачивается в код С#. Полученный в результате конвертации exe-файл представляет из себя сборку .Net, содержащую исходный скрипт в кодировке Base64.

Поэтому созданный exe-файл не является самостоятельным, для работы ему требуется PowerShell и .NET версии 2.0 и выше. Также конвертация не увеличит скорость работы скрипта и не даст ему каких то дополнительных преимуществ. Тогда зачем вообще нужно конвертировать PowerShell в exe?

Плюсы все-же есть. К примеру, сконвертированный скрипт отрабатывает даже при запрете на выполнение PowerShell скриптов. Это поможет обойти политику выполнения.

политика restricted

 

Еще одно преимущество, это возможность скрытого запуска. Скомпилированный с параметрами noOutpup, noError и noConsole скрипт выполняется полностью незаметно для пользователя. Добиться подобного эффекта другими способами мне не удалось. Это важно для всяческих Logon скриптов.

Ну и наконец, конвертацию можно использовать в качестве альтернативы обфускации. К примеру, если вы передаете свои скрипты сторонним лицам и не хотите, чтобы они могли посмотреть исходный код. Однако тут есть один тонкий момент. Сконвертированный скрипт можно легко расконвертировать, выполнив его с ключом Extract, например:

script.exe -extract:″script.ps1″

Поэтому хранить в скриптах какие то важные вещи (напр. пароли) все же не стоит.

 
 
Комментарии
Альберт

Для запуска PowerShell скриптов без изменения политики предпочитаю использовать .cmd файл.
Из подводных камней: плохо экранируются кавычки в параметрах к .cmd файлу, сложно отлаживать в таком виде.
Сам файл такой:

$arch = @{$true="x86";$false="x64"}[$env:Processor_Architecture -eq "x86"]
$thisfile=$thisfilename
$thisdir=split-path $thisfile
$datetime = Get-Date -format yyyy-MM-dd_HH-mm-ss
$caption = split-path $thisfile -leaf

function Elevate(){
$myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal = new-object System.Security.Principal.WindowsPrincipal($myWindowsID)
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator
if ($myWindowsPrincipal.IsInRole($adminRole)){
$Host.UI.RawUI.WindowTitle = $thisfile + " (Elevated)"
clear-host
}else{
$newProcess = new-object System.Diagnostics.ProcessStartInfo "cmd.exe";
$newProcess.Arguments = "/C `"$thisfilename`"";
$newProcess.Verb = "runas";
[System.Diagnostics.Process]::Start($newProcess);
exit
}
}
Elevate

Альберт

И конечно же всё поехало, исправьте если в силах )
Вот ссылка на код:
https://pastebin.com/fEBHhvZN