Як запустити 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-файл і він тихо виконається.
На закінчення уточню, що всі три способи не можуть повністю приховати запуск скрипта. При запуску все одно видно спливаюче вікно. Помітити цей момент складно, оскільки вікно спливає на частки секунди, але все ж можна.П>.