Защита от повторного запуска
P.S. Просьба, не тестировать этот скрипт из редактора.
Код:

$objService=ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
$colProc=$objService.ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE '%" & @ScriptName & "%'")
If $colProc.Count > 1 Then
Msgbox(0+48,"Совпадений: " & $colProc.Count,"Скрипт уже запущен")
Exit(1)
EndIf
;~ --== Здесь должен быть код Вашего скрипта ==--
Отслеживание вновь запущенных процессов:
Код:

$strComputer = "."
$objWMIService = ObjGet("winmgmts:" & _
"{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colMonitoredProcesses=$objWMIService.ExecNotificationQuery("select * from __instancecreationevent " & _
" within 1 where TargetInstance isa 'Win32_Process'")
While 1
$objLatestProcess = $colMonitoredProcesses.NextEvent
MsgBox(0,"Обнаружен запуск",$objLatestProcess.TargetInstance.Name)
WEnd
Отслеживание завершающихся процессов:
Код:

$strComputer = "."
$objWMIService = ObjGet("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colMonitoredProcesses = $objWMIService.ExecNotificationQuery("select * from __instancedeletionevent " _
& "within 1 where TargetInstance isa 'Win32_Process'")
While 1
$objLatestProcess = $colMonitoredProcesses.NextEvent
MsgBox(0,"Обнаружено завершение",$objLatestProcess.TargetInstance.Name)
WEnd
Отследить запуск определённого процесса:
Код:

$process='notepad.exe'
$strComputer = "."
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$objEvents = $objWMIService.ExecNotificationQuery _
("SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName = '" & $process & "'")
MsgBox(0,"","Ожидание событий ...")
While 1
$objReceivedEvent = $objEvents.NextEvent
MsgBox(0,"",$process & " запущен")
WEnd
Отследить завершение определённого процесса:
Код:

$process='notepad.exe'
$strComputer = "."
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$objEvents = $objWMIService.ExecNotificationQuery _
("SELECT * FROM Win32_ProcessStopTrace WHERE ProcessName = '" & $process & "'")
MsgBox(0,"","Ожидание событий ...")
While 1
$objReceivedEvent = $objEvents.NextEvent
MsgBox(0,"",$process & " завершён")
WEnd
А этот скрипт я как-то писал для отслеживания вируса по его PID (долгая история...)
С его помощью можно определить, какие программы запускали на компьютере в ваше отсутствие,
остаётся только перенаправить информацию в текстовой файл...
Код:

#Include <date.au3>
$strComputer = "."
$objWMIService = ObjGet("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colMonitoredProcesses = $objWMIService.ExecNotificationQuery("select * from __instancedeletionevent " _
& "within 1 where TargetInstance isa 'Win32_Process'")
While 1
$objLatestProcess = $colMonitoredProcesses.NextEvent
$pdel = _Now()
MsgBox(0,"", "Имя: " & $objLatestProcess.TargetInstance.Name & @CRLF & _
"Расположение: " & $objLatestProcess.TargetInstance.ExecutablePath & @CRLF & _
"Командная строка: " & $objLatestProcess.TargetInstance.CommandLine & @CRLF & _
"PID: " & $objLatestProcess.TargetInstance.ProcessId & @CRLF & _
"Приоритет: " & $objLatestProcess.TargetInstance.Priority & @CRLF & _
"Время запуска: " & WMIDateStringToDate($objLatestProcess.TargetInstance.CreationDate) & @CRLF & _
"Время завершения: " & $pdel & @CRLF & _
"____________________________________")
WEnd
;###########################################
Func WMIDateStringToDate($str)
Local $WMIDateStringToDate
If not $str = "" Then
$WMIDateStringToDate=StringMid($str,7,2) & '.' & StringMid($str,5,2) & '.' & _
StringLeft($str,4) & chr(32) & StringMid($str,9,2) & ':' & _
StringMid($str,11,2) & ':' & StringMid($str,13,2)
EndIf
Return $WMIDateStringToDate
EndFunc
З.Ы.
Не мешало бы скрыть присутствие скрипта в списке процессов.
Слышал, что это можно сделать через WinApi, но я не знаю как...