دليل كامل لاستخدام أمر Get-WinEvent في PowerShell

يحتوي نظام Windows على العديد من سجلات الأحداث المختلفة، ولكن كيف يمكنك الحصول عليها بسرعة؟ يمكن لأمر الـ Get-WinEvent استرجاع سجلات الأحداث الكلاسيكية في Windows مثل سجلات النظام والتطبيقات، وسجلات يتم إنشاؤها بواسطة تقنية سجل الأحداث في Windows، وحتى سجلات تتبع الأحداث لنظام التشغيل Windows (ETW)!

في هذا المقال، تعرّف على كيفية الاستفادة من Get-WinEvent لاسترجاع الأحداث وتصفيةها من سجلات الأحداث!

المتطلبات المسبقة

لمتابعة العملية، تحتاج فقط إلى إصدار حديث من Windows 10 وPowerShell 5.1 أو أحدث. يستخدم هذا المقال Windows 10 وPowerShell 7.1.

عرض السجلات المتاحة باستخدام Get-WinEvent

من الصعب معرفة الإدخالات في السجل التي قد تحتاجها دون معرفة جميع السجلات المتاحة. باستخدام Get-WinEvent، يمكنك عرض جميع السجلات المتاحة بسرعة باستخدام معامل -ListLog. قيمة المعامل * تخبر Get-WinEvent بعرض جميع السجلات دون تصفية. كما يتم استرجاع جميع السجلات كما هو موضح أدناه، ولكن يتم عرض مجموعة محدودة من الخصائص باستخدام Select-Object cmdlet.

Get-WinEvent -ListLog * | Select-Object LogName, RecordCount, IsClassicLog, IsEnabled, LogMode, LogType | Format-Table -AutoSize

ليست جميع السجلات ممكنة بشكل افتراضي. قد تحتاج إلى فتح مُعاين الأحداث، وتحديد السجل، والنقر بزر الماوس الأيمن لتمكين السجل قبل ظهور الأحداث.

Listing all available event logs.

جميع السجلات بعد ويندوز فيستا تُحفظ كملفات \*.evtx بدلاً من التنسيق القديم \*.evt. تعرض خاصية IsClassicLog ما إذا كانت أحداث السجل محددة في ملف الرسائل بتنسيق \*.mc أم في توثيق بتنسيق \*.xml.

خاصية مثيرة للاهتمام هي LogMode، التي قد لاحظت أنها عادةً ما تكون مضبوطة على Circular.

  • Circular – قم بالكتابة فوق أقدم إدخال سجل بمجرد ملءه.
  • Retain – احتفظ بجميع الأحداث حتى يمتلئ السجل وتتوقف عن تسجيل الأحداث حتى يتم الافراج عنه.
  • AutoBackup – نسخ احتياطي تلقائيًا وأرشفة سجلات الأحداث بمجرد ملءها.
Highlighting the LogMode property.

أخيرًا، عند النظر إلى خاصية LogType، هناك عدة أنواع مختلفة من السجلات. تعمل هذه الخاصية بشكل أكبر كخاصية تصنيفية، ولكنها عادة ما تُبين كيفية استخدام السجل وأنواع الأحداث المعروضة.

  • إداري – مخصص في المقام الأول للمستخدمين النهائيين والمستخدمين الإداريين.
  • تحليلي – عادةً ما يكون سجل حجم كبير، يهدف إلى وصف عمليات البرنامج.
  • تصحيح – مخصص للمطورين الذين يحتاجون إلى فهم عميق للتفاصيل الداخلية للبرنامج.
  • تشغيلي – حدث يحدث أثناء التشغيل ويكون مفيدًا لتشخيص الحوادث وتشغيل العمليات.
Highlighting the LogType property.

قائمة موفري سجل الحدث

الآن بعد أن لديك فهماً قويًا للسجلات المختلفة وخصائصها، من المفيد فهم ما هو موفر سجل الحدث. الموفر، في مصطلح سجل الحدث، هو مصدر لحدث ما.

موفرو سجل الحدث فريدة ومرتبطة بكل سجل، مثل سجلات التطبيقات أو النظام، وسيكون مصدر الاسم حيث ينبثق الحدث.

ربما تود العثور على مشاكل عند تصفية السجلات، وقد تكون مهتمًا فقط بالمشاكل التي يتم تقديمها من موفر معين. لعرض ما هي الموفرات المتاحة، استخدم المعلمة -ListProvider. كما هو موضح أدناه، * يقوم بسرد جميع الموفرين المتاحين وما هي السجلات التي يتم ربط الموفرات بها، مثل Windows PowerShell أو System.

Get-WinEvent -ListProvider * | Format-Table -Autosize
Listing event log providers.

ربما ترغب فقط في إدراج مزودين متاحين لسجل معين، مثل System. للقيام بذلك، يمكنك تصفية الأحداث باستخدام أمر Where-Object باستخدام قيم خاصية LogLinks. تعرض خاصية LogLinks السجلات الحدثية المرتبطة كقائمة.

لتصفية السجلات المطلوبة باستخدام Where-Object، استخدم مشغل المقارنة -In لتصفية الأحداث فقط التي تحتوي على System في قيمة خاصية LogLinks. وأخيرًا، استخدم Format-Table -AutoSize لجعل قراءة الناتج أسهل، كما هو موضح أدناه.

Get-WinEvent -ListProvider * | Where-Object { 'System' -In ($_ | Select-Object -ExpandProperty Loglinks | Select-Object -ExpandProperty Logname) } | Format-Table -AutoSize
Filtering event log providers to a specific log.

استرداد السجلات الحدثية الكلاسيكية باستخدام Get-WinEvent

الخطوة الأولى في حل مشكلة ويندوز هي استرداد سجل التطبيق أو النظام، والذي يتمثل في سجلات الحدث الكلاسيكية. في المثال الموضح أدناه، ستقوم بإسترداد أول 100 حدث باستخدام معلمة -MaxEvents من سجل الحدث التطبيق.

لجعل قراءة النتائج أسهل، حدد فقط الخصائص المطلوبة لقراءة الإدخالات بسهولة. وإلا، يتم تجميع الإدخالات حسب اسم مزود الخدمة، مما يجعل تجزئة قائمة النتائج صعبة.

Get-WinEvent -LogName 'Application' -MaxEvents 100 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning events from the Application log.

العثور على أحداث Windows الحديثة باستخدام Get-WinEvent

الآن بعد أن استرجعت الأحداث من سجل التطبيقات الكلاسيكي، ماذا عن النتائج من سجل أحداث Windows الأحدث، مثل Microsoft-Windows-WindowsUpdateClient/Operational؟

على عكس سجل الأحداث الكلاسيكي، مثل System، فإن Microsoft-Windows-WindowsUpdateClient/Operational هو سجل حديث، ويعمل Get-WinEvent بنفس الطريقة كما هو موضح أدناه.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning Windows Event Log records.

ماذا عن الحصول على أقدم الأحداث فقط؟ على الرغم من أنه يمكنك عكس ترتيب النتائج باستخدام Sort-Object، استخدم معلمة -Oldest لاسترجاع أول 10 أحداث، كما هو موضح أدناه.

يقوم أمر Get-WinEvent بعملية التصفية بدلاً من إرجاع جميع النتائج والفرز، وهو أمر أبطأ عادةً.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -Oldest -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning only the oldest events in a Windows Event Log.

استرجاع ملفات تتبع الأحداث لنظام Windows (ETW) باستخدام Get-WinEvent

ربما لديك ملف *.evtx مصدره جهاز كمبيوتر آخر أو لقد قمت بنسخ احتياطي لسجل موجود. يمكنك قراءة تلك السجلات باستخدام cmdlet Get-WinEvent. إذا كنت بحاجة إلى الاحتفاظ بالسجلات لأغراض التدقيق، فإن Get-WinEvent هو طريقة رائعة للاستعلام عن تلك السجلات باستخدام cmdlets قياسية ضمن النصوص بسرعة.

لعرض استرداد سجل الدخول من ملف *.evtx، تحتاج إلى ملف سجل تم تصديره.

1. قم بفتح مراقب الأحداث وانتقل إلى سجل. في هذا المثال، انتقل إلى سجل التطبيقات وخدمات السجلات → PowerShell في Windows.

Navigate to a Windows Event Viewer log.

2. بعد ذلك، انقر فوق عنصر القائمة حفظ جميع الأحداث ك… في اللوحة الإجراءات.

Save the log file.

3. قم بحفظ الملف في مكان على القرص لاسترجاعه بواسطة أمر Get-WinEvent.

Choose a location to save the log file.

الآن بعد أن قمت بتصدير ملف سجل، قم بتمرير موقع ملف السجل عبر معلمة -Path لقراءة الأحداث. في المثال المعروض أدناه، يتم تصدير سجل PowerShell في Windows للاستهلاك لاحقًا.

Get-WinEvent -Path 'C:\Articles\WindowsPowerShell.evtx' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Retrieving specific events from the exported event file.

تصفية سجلات الأحداث في Windows باستخدام Get-WinEvent

على الرغم من أنه يمكنك تصفية السجلات باستخدام cmdlet Where-Object القياسي، يقدم Get-WinEvent فلاتر مدمجة. من خلال إرجاع جميع النتائج ومن ثم تصفيةها، يتم إجراء مزيد من العمل من اللازم. بدلاً من ذلك، يجب أن تحاول دائمًا تصفية في المصدر قدر الإمكان.

يوفر cmdlet Get-WinEvent ثلاث معلمات لمساعدتك في التصفية من خلال آلاف الأحداث تسمى -FilterHashTable، -FilterXPath، و -FilterXML. كل معلمة تقوم عمومًا بنفس المهمة فقط بطريقة مختلفة.

تصفية سجلات الأحداث باستخدام FilterHashTable

المعلمة -FilterHashTable تقوم بتصفية المحتوى استنادًا إلى الخصائص المطابقة، مثل LogName. بدلاً من استخدام المعلمة -LogName للتصفية حسب سجل معين، يمكنك بدلاً من ذلك استخدام جدول تجزئة، مثل @{'LogName' = 'Application'}، الذي سيتوافق مع خاصية الحدث LogName.

المثال الموضح أدناه يوفر جدول تجزئة للمعلمة -FilterHashTable الذي يبحث فقط عن سجل التطبيقات وببدء الوقت الذي تكون فيه جميع الأحداث بعد منتصف الليل من اليوم الحالي، Get-WinEvent يقوم بإرجاع النتائج بسرعة.

Get-WinEvent -FilterHashTable @{'LogName' = 'Application'; 'StartTime' = (Get-Date -Hour 0 -Minute 0 -Second 0)} | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events with the FilterHashTable parameter.

قارن بين سرعات التصفية لنفس الأمر أعلاه مع أمر مصفى من خلال Where-Object بدلاً من استخدام المعلمة -FilterHashTable على الخط الأنابيب. كما ترى، الأمر الذي يستخدم Where-Object أبطأ بكثير من تلك التي تستخدم المعلمة -FilterHashTable.

Comparing filtering with FilterHashTable and Where-Object.

تصفية سجلات الأحداث باستخدام المعلمة FilterXPath

تُخزن إدخالات سجل الأحداث كملفات XML، وبالتالي يمكنك استخدام لغة XPath، وهي لغة استعلام XML، لتصفية إدخالات السجل. من خلال أداء نفس الأمر المستخدم أعلاه وترجمته إلى XPath، يمكنك تحقيق نفس النتائج.

لصياغة استعلام XPath، استخدم القدرة على التصفية في مستعرض أحداث Windows، كما هو موضح أدناه.

1. افتح عارض الأحداث وانتقل إلى سجل، مثل سجل سجلات Windows → التطبيقات.

Opening the Windows Event Viewer.

2. بعد ذلك، انقر على رابط تصفية السجل الحالي في الجزء الأيمن من النافذة.

Choosing to Filter the Current Log.

3. أدخل المعايير التي ترغب في استخدامها لتصفية السجل.

Creating a filter for the current log.

4. انقر فوق علامة XML وانسخ القسم الذي يتضمن داخل علامة التحديد.

Copying the XPath command.

5. الآن، قم بنسخ ولصق المحتوى المنسوخ مع المعلمة -FilterXPath. يمكنك الآن أن ترى أدناه باستخدام بنية XPath المستخدمة من مستعرض سجل الأحداث، يمكنك بناء استعلام لتصفية فقط المعلومات الضرورية.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[(Level=1  or Level=3)]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Demonstrating the use of the FilterXPath parameter.

الانغماس في كيفية صياغة استعلامات XPath خارج نطاق هذه المقالة، ولكن يتم عرض الشكل الأساسي أدناه. عندما تقوم المعلمة FilterXPath بتصفية تاريخ، سترى فارقًا كبيرًا واحدًا: تحتاج إلى استخدام تنسيق تاريخ أكثر تحديدًا، yyyy-MM-ddTHH:mm:ss.fffZ، الذي يجب أن يتم إرجاع التاريخ في توقيت عالمي منسق، وهو ما يشير إليه التبديل -AsUTC.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events using XPath.

تصفية نتائج سجل الأحداث باستخدام FilterXML

وأخيرًا، المعلمة الأخيرة المتاحة للتصفية هي المعلمة -FilterXML. على عكس المعلمتين -FilterXPath و -FilterHashTable، تأخذ هذه المعلمة XML التي يتم استخدامها بعد ذلك لتصفية الأحداث. تسمح المعلمة -FilterXML بقواعد أكثر تعقيدًا، وكما هو موضح أدناه، يمكن أن تقوم بتكرار الأمثلة السابقة للتصفية.

كما هو موضح في المثال السابق، يمكنك الحصول على استعلام معين مُعدّ مسبقًا من القدرة على عارض الأحداث → تصفية السجل الحالي. بدلاً من اختيار المحتوى فقط في العقدة Select، ستستخدم الاستعلام بأكمله. لم يتم اختيار مرشحات فعلية، كما هو مشار إليه بوجود علامة * في عقدة Select. سيوفر هذا العلامات العامة للمثال التالي.

Selecting the entire XML query from Filter Current Log in the Event Viewer.

بدلاً من إنشاء أمر في سطر واحد، افصل أولاً الاستعلام XML وقم بتعيين العلامات لمتغير، $Query، في المثال أدناه. تعيين الاستعلام إلى متغير يجعل الأمر أكثر سهولة في الاستخدام والقراءة. بعد ذلك، قم بتمرير متغير $Query إلى المعامل -FilterXML لـ Get-WinEvent.

كما هو موضح أدناه، سترى نتائج الاستعلام المعقد أكثر، والذي يُرجع جميع الأحداث من ذلك اليوم والتي تم تخزينها في سجل Application.

$Query = "<QueryList>
  <Query Id='0' Path='Application'>
    <Select Path='Application'>*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]</Select>
  </Query>
</QueryList>"

Get-WinEvent -FilterXML $Query | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Showing how FilterXML works.

الختام

يجعل cmdlet Get-WinEvent عمل قصير من استعلام مصادر سجل الأحداث المتعددة باستخدام قدرات تصفية قوية. من التدقيق إلى حل المشاكل، يعتبر cmdlet Get-WinEvent إضافة أساسية لأي مجموعة أدوات مسؤولي النظام!

Source:
https://adamtheautomator.com/get-winevent/