المهام المجدولة في ويندوز
مقدمة
تتيح المهام المجدولة (Scheduled Tasks) تنفيذ البرامج أو السكربتات تلقائيًا وفقًا لمشغلات محددة.
المفاهيم الأساسية
مكونات المهمة
- المشغل (Trigger): متى يتم تنفيذ المهمة
- الإجراء: ما تفعله المهمة
- الشروط: معايير إضافية
- الإعدادات: خيارات التنفيذ
أنواع المشغلات
| النوع | الوصف |
|---|---|
| AtStartup | عند بدء تشغيل النظام |
| AtLogOn | عند تسجيل دخول المستخدم |
| Once | مرة واحدة فقط |
| Daily | يوميًا |
| Weekly | أسبوعيًا |
| OnEvent | عند حدث محدد |
| OnIdle | عندما يكون النظام خاملاً |
الإدارة عبر الواجهة الرسومية
Task Scheduler (taskschd.msc)
Win+R > taskschd.msc
الهيكل:
- مكتبة جدولة المهام
- Microsoft (مهام النظام)
- مجلدات مخصصة
إنشاء مهمة أساسية
- Action > Create Basic Task
- اتبع المعالج
- تحديد الاسم، المشغل، الإجراء
إنشاء مهمة متقدمة
- Action > Create Task
- علامة التبويب General: الاسم، الحساب، الامتيازات
- علامة التبويب Triggers: المشغلات
- علامة التبويب Actions: البرامج المراد تنفيذها
- علامة التبويب Conditions: المعايير
- علامة التبويب Settings: الخيارات
الإدارة عبر PowerShell
سرد المهام
# جميع المهام
Get-ScheduledTask
# المهام النشطة
Get-ScheduledTask | Where-Object {$_.State -eq "Ready"}
# البحث حسب الاسم
Get-ScheduledTask -TaskName "*Update*"
# تفاصيل مهمة
Get-ScheduledTask -TaskName "NomTache" | Get-ScheduledTaskInfo
إنشاء مهمة
# تحديد الإجراء
$action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument "-File C:\Scripts\MonScript.ps1"
# تحديد المشغل
$trigger = New-ScheduledTaskTrigger -Daily -At "08:00"
# تحديد الرئيسي (من ينفذ)
$principal = New-ScheduledTaskPrincipal `
-UserId "SYSTEM" `
-RunLevel Highest
# الخيارات
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries
# إنشاء المهمة
Register-ScheduledTask `
-TaskName "MaTache" `
-Action $action `
-Trigger $trigger `
-Principal $principal `
-Settings $settings `
-Description "Description de ma tache"
أنواع المشغلات
# عند بدء التشغيل
$trigger = New-ScheduledTaskTrigger -AtStartup
# عند تسجيل الدخول
$trigger = New-ScheduledTaskTrigger -AtLogOn
# مرة واحدة
$trigger = New-ScheduledTaskTrigger -Once -At "2025-01-15 10:00"
# يوميًا
$trigger = New-ScheduledTaskTrigger -Daily -At "08:00"
# أسبوعيًا
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At "09:00"
# عند حدث
$trigger = New-ScheduledTaskTrigger -AtStartup
# (للأحداث المحددة، استخدم schtasks.exe)
تعديل مهمة
# تغيير المشغل
$newTrigger = New-ScheduledTaskTrigger -Daily -At "10:00"
Set-ScheduledTask -TaskName "MaTache" -Trigger $newTrigger
# تفعيل/تعطيل
Enable-ScheduledTask -TaskName "MaTache"
Disable-ScheduledTask -TaskName "MaTache"
حذف مهمة
Unregister-ScheduledTask -TaskName "MaTache" -Confirm:$false
تنفيذ يدوي
Start-ScheduledTask -TaskName "MaTache"
الإدارة عبر CMD
أمر SCHTASKS
:: سرد المهام
schtasks /query
:: تفاصيل مهمة
schtasks /query /tn "NomTache" /v /fo LIST
:: إنشاء مهمة
schtasks /create /tn "MaTache" /tr "C:\programme.exe" /sc daily /st 08:00
:: تنفيذ
schtasks /run /tn "MaTache"
:: حذف
schtasks /delete /tn "MaTache" /f
:: تعديل
schtasks /change /tn "MaTache" /st 10:00
الخيارات الشائعة
/sc نوع الجدولة (minute, hourly, daily, weekly, monthly, once, onstart, onlogon)
/st وقت البدء (HH:MM)
/sd تاريخ البدء (MM/DD/YYYY)
/ru التشغيل كمستخدم
/rp تشغيل ككلمة مرور
/rl مستوى التشغيل (LIMITED, HIGHEST)
أمان المهام المجدولة
المخاطر
تعتبر المهام المجدولة وسيلة شائعة لـ الاستمرارية يستخدمها المهاجمون:
- يتم تنفيذها تلقائيًا
- يمكن أن تمتلك امتيازات عالية
- غالبًا ما يتم تجاهلها أثناء عمليات التدقيق
التحقق من الأمان
# المهام التي يتم تنفيذها كـ SYSTEM
Get-ScheduledTask | ForEach-Object {
$task = $_
$principal = $task.Principal
if ($principal.UserId -eq "SYSTEM" -or $principal.UserId -like "*SYSTEM*") {
[PSCustomObject]@{
Name = $task.TaskName
Path = $task.TaskPath
User = $principal.UserId
}
}
} | Format-Table
# المهام مع تنفيذات في مسارات مشبوهة
Get-ScheduledTask | ForEach-Object {
$actions = $_.Actions
foreach ($action in $actions) {
if ($action.Execute -like "*\Temp\*" -or
$action.Execute -like "*\AppData\*" -or
$action.Execute -like "*\Downloads\*") {
[PSCustomObject]@{
Task = $_.TaskName
Execute = $action.Execute
Arguments = $action.Arguments
}
}
}
} | Format-Table
# المهام التي تم إنشاؤها مؤخرًا (آخر 24 ساعة)
Get-ScheduledTask | Where-Object {
$_.Date -gt (Get-Date).AddDays(-1)
}
مؤشرات الاختراق (IOC)
| المؤشر | الوصف |
|---|---|
| مهمة باسم عشوائي | قد يكون برنامج ضار |
| تنفيذ في Temp | مشبوه |
| PowerShell مشفر | مشبوه جدًا |
| مهمة مخفية | تقنية تجنب |
| SYSTEM ينفذ سكربتات المستخدم | خطر مرتفع |
تعزيز الأمان
- تدقيق بانتظام للمهام المجدولة
- تقييد من يمكنه إنشاء المهام
- مراقبة إنشاء المهام (Event ID 4698)
- استخدام حسابات خدمة مخصصة
الاستمرارية عبر المهام المجدولة
تقنية الهجوم (للتعرف عليها للدفاع)
# مثال على الاستمرارية الخبيثة (لا تستخدم)
# يوضح كيف يتصرف المهاجمون
$action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument "-WindowStyle Hidden -EncodedCommand <base64>"
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask `
-TaskName "WindowsUpdateHelper" `
-Action $action `
-Trigger $trigger `
-Principal (New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest) `
-Force
الكشف
# سكربت للكشف عن المهام المشبوهة
$suspicious = @()
Get-ScheduledTask | ForEach-Object {
$task = $_
$isSuspicious = $false
$reasons = @()
# التحقق من الإجراءات
foreach ($action in $task.Actions) {
# PowerShell مع أوامر مشفرة
if ($action.Arguments -match "-[Ee]ncoded") {
$isSuspicious = $true
$reasons += "EncodedCommand"
}
# تنفيذات في مسارات مشبوهة
if ($action.Execute -match "\\(Temp|Downloads|AppData)\\") {
$isSuspicious = $true
$reasons += "مسار مشبوه"
}
# أسماء تحاكي خدمات ويندوز
if ($task.TaskName -match "^(WindowsUpdate|MicrosoftEdge|Chrome|Adobe).*\d{4,}") {
$isSuspicious = $true
$reasons += "اسم مشبوه"
}
}
if ($isSuspicious) {
$suspicious += [PSCustomObject]@{
TaskName = $task.TaskName
TaskPath = $task.TaskPath
Raisons = ($reasons -join ", ")
}
}
}
if ($suspicious) {
Write-Host "تم اكتشاف مهام مشبوهة:" -ForegroundColor Red
$suspicious | Format-Table -AutoSize
} else {
Write-Host "لم يتم اكتشاف أي مهام مشبوهة." -ForegroundColor Green
}
التسجيل
معرفات الأحداث
| معرف الحدث | السجل | الوصف |
|---|---|---|
| 4698 | Security | تم إنشاء مهمة |
| 4699 | Security | تم حذف مهمة |
| 4700 | Security | تم تفعيل مهمة |
| 4701 | Security | تم تعطيل مهمة |
| 4702 | Security | تم تحديث مهمة |
| 106 | TaskScheduler/Operational | تم تسجيل مهمة |
| 140 | TaskScheduler/Operational | تم تحديث مهمة |
| 141 | TaskScheduler/Operational | تم حذف مهمة |
| 200 | TaskScheduler/Operational | تم بدء إجراء |
| 201 | TaskScheduler/Operational | تم إنهاء إجراء |
تفعيل التدقيق
# تفعيل تدقيق المهام المجدولة (GPO أو أمر)
auditpol /set /subcategory:"Other Object Access Events" /success:enable /failure:enable
استعراض السجلات
# أحداث إنشاء المهام
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4698
} -MaxEvents 10 | Format-Table TimeCreated, Message -Wrap
# السجلات التشغيلية
Get-WinEvent -LogName 'Microsoft-Windows-TaskScheduler/Operational' -MaxEvents 20
تمارين
- أنشئ مهمة تقوم بتنفيذ سكربت PowerShell كل يوم الساعة 9 صباحًا
- أنشئ مهمة تبدأ عند إقلاع النظام
- قم بتدقيق المهام الحالية لتحديد المشبوهة منها
- استعرض سجلات إنشاء المهام خلال الأيام السبعة الماضية