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

Как запустить PowerShell в скрытом режиме

Как запустить PowerShell в скрытом режиме

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

Способ первый

Начиная со второй версии PowerShell при запуске можно использовать параметр -WindowStyle  со значением Hidden. Это позволяет осуществить запуск в скрытом режиме, без открытия консоли. Предположим, что у меня в папке C:\Temp лежит скрипт hello.ps1, который надо ″по тихому″ выполнить при входе пользователя. Для этого используем следующую команду:

powershell.exe -nologo -noninteractive -windowStyle hidden -command ″C:\Temp\hello.ps1″

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

Способ второй

Для скрытия окна мы воспользуемся Windows API, точнее функцией ShowWindowAsynс. Первой командой сохраняем сигнатуру C# функции ShowWindowAsync в переменную. Затем с помощью командлета Add-Type добавляем функцию в сеанс в виде статического метода класса. Полученному методу ShowWindowAsync передаем в виде параметров дескриптор окна и цифровое значение, указывающее как должно отображаться окно. Для получения текущего процесса PowerShell используется конструкция  Get-Process -Id $pid, дескриптор окна получаем из его свойства MainWindowHandle. В качестве цифрового значения указываем 0 (SW_HIDE), чтобы скрыть окно:

$Signature = @″
[DllImport(«user32.dll»)]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
@
$ShowWindowAsync = Add-Type -MemberDefinition $Signature -Name «Win32ShowWindowAsync» -Namespace Win32Functions -PassThru
$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $pid).MainWindowHandle, 0)

Полученный код добавляем в начало скрипта.

Способ третий

Скрыть запуск PowerShell можно, как ни странно, с помощью VBScript. Для этого создаем vbs-файл следующего содержания:

command = ″powershell.exe -nologo -noninteractive -command C:\Temp\hello.ps1″
set shell = CreateObject(″WScript.Shell″)
shell.Run command,0, false

Цифра 0 в скрипте означает запуск  в скрытом виде, false — не ждать окончания выполнения команды.

Теперь для запуска PowerShell скрипта надо запустить этот vbs-файл и он тихо выполнится.

В заключение уточню, что все три способа не могут полностью скрыть запуск скрипта. При запуске все равно видно всплывающее окно. Заметить этот момент сложно, поскольку окно всплывает на доли секунды, но все же можно.

 
 
Комментарии

Пока нет комментариев.

Ответить