Розглянемо, як за допомогою PowerShell перевірити, запущено чи певний додаток або процес, як автоматично перезапустити його при збої, якщо його випадково закрив користувач або він став витікати (використовувати занадто багато оперативної пам’яті).
Раніше ми показували, як за допомогою PowerShell можна управляти процесами Windows. Щоб перевірити, чи запущений процес notepad.exe і перезапустити його, можна використовувати такий скрипт.
If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:Windowsnotepad.exe
}
Можна автоматично перезапустити процес, якщо він не відповідає (завис) або якщо він став використовувати занадто багато оперативної пам’яті (в цьому прикладі більше 500 Мб):
$proc = Get-Process -Name notepad| Sort-Object -Property ProcessName -Unique
If (($proc.Responding -eq $false) –or ($proc.WorkingSet -GT 500000*1024)} {
$proc.Kill()
Start-Sleep -s 10
Invoke-Item C:Windowsnotepad.exe
}
За допомогою for можна зробити нескінченний цикл, який запускає процес, кожні 60 секунд перевіряє що він запущений і перезапускає його, якщо потрібно:
for(;;)
{
try
{
If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:Windowsnotepad.exe
}
$proc = Get-Process -Name notepad | Sort-Object -Property ProcessName -Unique -ErrorAction SilentlyContinue
If (!$proc -or ($proc.Responding -eq $false) –or ($proc.WorkingSet -GT 200000*1024)) {
$proc.Kill()
Start-Sleep -s 10
Invoke-Item C:Windowsnotepad.exe
}
}
catch
{
}
Start-sleep -s 60
}
$proc = Get-Process -ComputerName PC01 -Name notepad | Sort-Object -Property ProcessName -Unique -ErrorAction SilentlyContinue
Для віддаленого запуску процесу можна використовувати Invoke-Command:
Invoke-Command -ComputerName PC01 -Credential $Cred -ScriptBlock {Start-Process C:Windowsnotepad.exe -wait -verb runas;}
Ви можете запустити цей PowerShell скрипт у вигляді логон скрипта GPO при вході користувача.
В цьому випадку потрібно зберегти PowerShell код у файлі з розширенням PS1. Можна підписати цей скрипт цифровим підписом, змінити налаштування політики запуску PowerShell скриптів, або запускати його з параметром –ExecutionPolicy Bypass
.
- Ім’я запускається файлу:
%windir%System32WindowsPowerShellv1.0powershell.exe
- Параметри запуску:
-windowstyle hidden -ExecutionPolicy Bypass –Noprofile -file %~dp0CheckProcess.ps1
Також можна запускати PS1 скрипт за розкладом за допомогою завдання планувальника. Використовуйте аналогічні параметри запуску. Додатково можна вказати обліковий запис користувача, від імені якого запускати процес.
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-windowstyle hidden -ExecutionPolicy Bypass -file %windir%CheckProcess.ps1"
$Trigger= New-ScheduledTaskTrigger -AtLogon
$Principal=New-ScheduledTaskPrincipal -UserId "aaivanov" -LogonType Interactive
$Task=New-ScheduledTask -Action $Action -Trigger $Trigger -Principal $Principal
Register-ScheduledTask -TaskName "Check Notepad Process" -InputObject $Task
Або цей PowerShell скрипт можна запускати у вигляді служби Windows