انتقل إلى المحتوى الرئيسي

المهام المجدولة في ويندوز

مقدمة​

تتيح المهام المجدولة (Scheduled Tasks) تنفيذ البرامج أو السكربتات تلقائيًا وفقًا لمشغلات محددة.

المفاهيم الأساسية​

مكونات المهمة​

  1. المشغل (Trigger): متى يتم تنفيذ المهمة
  2. الإجراء: ما تفعله المهمة
  3. الشروط: معايير إضافية
  4. الإعدادات: خيارات التنفيذ

أنواع المشغلات​

النوعالوصف
AtStartupعند بدء تشغيل النظام
AtLogOnعند تسجيل دخول المستخدم
Onceمرة واحدة فقط
Dailyيوميًا
Weeklyأسبوعيًا
OnEventعند حدث محدد
OnIdleعندما يكون النظام خاملاً

الإدارة عبر الواجهة الرسومية​

Task Scheduler (taskschd.msc)​

Win+R > taskschd.msc

الهيكل:

  • مكتبة جدولة المهام
    • Microsoft (مهام النظام)
    • مجلدات مخصصة

إنشاء مهمة أساسية​

  1. Action > Create Basic Task
  2. اتبع المعالج
  3. تحديد الاسم، المشغل، الإجراء

إنشاء مهمة متقدمة​

  1. Action > Create Task
  2. علامة التبويب General: الاسم، الحساب، الامتيازات
  3. علامة التبويب Triggers: المشغلات
  4. علامة التبويب Actions: البرامج المراد تنفيذها
  5. علامة التبويب Conditions: المعايير
  6. علامة التبويب 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 ينفذ سكربتات المستخدمخطر مرتفع

تعزيز الأمان​

  1. تدقيق بانتظام للمهام المجدولة
  2. تقييد من يمكنه إنشاء المهام
  3. مراقبة إنشاء المهام (Event ID 4698)
  4. استخدام حسابات خدمة مخصصة

الاستمرارية عبر المهام المجدولة​

تقنية الهجوم (للتعرف عليها للدفاع)​

# مثال على الاستمرارية الخبيثة (لا تستخدم)
# يوضح كيف يتصرف المهاجمون

$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
}

التسجيل​

معرفات الأحداث​

معرف الحدثالسجلالوصف
4698Securityتم إنشاء مهمة
4699Securityتم حذف مهمة
4700Securityتم تفعيل مهمة
4701Securityتم تعطيل مهمة
4702Securityتم تحديث مهمة
106TaskScheduler/Operationalتم تسجيل مهمة
140TaskScheduler/Operationalتم تحديث مهمة
141TaskScheduler/Operationalتم حذف مهمة
200TaskScheduler/Operationalتم بدء إجراء
201TaskScheduler/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

تمارين​

  1. أنشئ مهمة تقوم بتنفيذ سكربت PowerShell كل يوم الساعة 9 صباحًا
  2. أنشئ مهمة تبدأ عند إقلاع النظام
  3. قم بتدقيق المهام الحالية لتحديد المشبوهة منها
  4. استعرض سجلات إنشاء المهام خلال الأيام السبعة الماضية

المراجع​