Trong bài viết này, chúng tôi sẽ trình bày cách theo dõi sự kiện khởi chạy một chương trình (tiến trình) cụ thể trong Windows và thực hiện hành động (chạy script, lệnh, chương trình, gửi email, v.v.). Là ví dụ, chúng ta sẽ theo dõi khởi chạy tiến trình notepad.exe. Và khi người dùng mở Notepad, Windows sẽ tự động chạy một script PowerShell cụ thể.
Trước hết, cấu hình chính sách audit tiến trình trên Windows. Bạn có thể cấu hình audit policy trên máy độc lập bằng Local Group Policy Editor (gpedit.msc). Nếu bạn muốn cấu hình chính sách trên máy tính và server trong domain AD, dùng console Group Policy Management (gpmc.msc).
- Đi đến Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> Audit Policy;
- Mở thuộc tính Audit process tracking và bật nó cho sự kiện Success;

- Áp dụng cài đặt Group Policy bằng lệnh:
gpupdate /force
Bây giờ, khi khởi động bất kỳ tiến trình nào trong Windows, sự kiện với EventID 4688 (A new process has been created) sẽ xuất hiện trong Event Viewer -> Windows Logs -> Security. Sự kiện cho thấy ai đã chạy tiến trình (Account name), tên tiến trình (New Process Name), và tên tiến trình cha (Creator Process Name).

Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4688
} | Select-Object TimeCreated,@{name='NewProcessName';expression={ $_.Properties[5].Value }}, @{name='User';expression={ $_.Properties[1].Value }}|where-object {$_.NewProcessName –like “*notepad.exe*”}
Kết quả, chúng ta có lịch sử chạy chương trình bởi user trên máy tính này.

Sau đó tạo tác vụ mới trong Task Scheduler sẽ chạy nếu sự kiện với EventID 4688 xuất hiện.
- Mở Task Scheduler (
taskschd.msc) và tạo tác vụ mới -> Create Task; - Đặt tên tác vụ và chỉ định nó phải chạy cho tất cả user (When running the task, use the following user account -> BUILTIN\Users). Nếu tạo tác vụ bằng GPO, dùng định dạng:
%LogonDomain%\%LogonUser%; - Trên tab Actions, đặt hành động bạn muốn thực hiện. Trong ví dụ này, tôi sẽ chạy script PowerShell (gọi
powershell.exevới tham số:-ExecutionPolicy Bypass -file "C:\PS\ProcessRunEvent.ps1);
- Sau đó gắn tác vụ với sự kiện Windows. Đi đến tab Triggers, chọn New -> On an event -> Custom -> New Event Filter;
- Trong cửa sổ tiếp theo, chỉ định các tùy chọn bộ lọc sự kiện:
Event logs:Security
Event ID:4688
Keywords:Audit Success

- Sau đó đi đến tab XML và bật tùy chọn Edit query manually. Chỉnh sửa truy vấn bằng cách thêm dòng sau vào bộ lọc:
and *[EventData[Data[@Name='NewProcessName'] and (Data='C:\Windows\System32\notepad.exe')]] - Bạn sẽ nhận được truy vấn XML sau:
<QueryList> <Query Id="0" Path="Security"> <Select Path="Security"> *[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and Task = 13312 and (band(Keywords,9007199254740992)) and (EventID=4688)]] and *[EventData[Data[@Name='NewProcessName'] and (Data='C:\Windows\System32\notepad.exe')]] </Select> </Query> </QueryList>

- Lưu tác vụ.
Thử chạy notepad.exe. Mỗi khi user mở Notepad, script PowerShell của bạn sẽ tự động chạy.
Ví dụ, bạn có thể hiển thị thông báo popup hoặc gửi email bằng PowerShell.
A process has exited. Trước đây chúng tôi đã trình bày script PowerShell tự động khởi động lại tiến trình nếu nó dừng. Giải pháp theo dõi sự kiện chạy/dừng tiến trình tinh tế hơn và không yêu cầu script PowerShell giám sát tiến trình Windows đang chạy.