מדריך מלא לשימוש בפקודת Get-WinEvent בפוורשל

שונים לווינדוס ישנם מספר רב של לוגים שונים, אך איך ניתן לאחזר אותם במהירות? הפקודה Get-WinEvent יכולה לאחזר לוגים קלאסיים שונים של ווינדוס כמו הלוגים של המערכת והיישומים, לוגים שנוצרים על ידי טכנולוגיית יומן הארועים של ווינדוס, ואפילו לוגים של אירועי מעקב עבור ווינדוס (ETW)!

במאמר זה, למד כיצד להשתמש ב- Get-WinEvent כדי לאחזר ולסנן ארועים מלוגים!

דרישות מוקדמות

כדי להתקדם, יש צורך רק בגרסה נוכחית של Windows 10 ובפוורשל 5.1 ומעלה. מאמר זה משתמש ב- Windows 10 ובפוורשל 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.

כל הלוגים לאחר Windows Vista נשמרים כקבצי *.evtx במקום פורמט ישן יותר של *.evt. מאפיין IsClassicLog מציין האם אירועי הלוג מוגדרים בקובץ הודעות Message File, בפורמט *.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.

מציאת אירועים עכשווים בווינדוס עם Get-WinEvent

עכשיו שאתה גישת אירועים מלוג האפליקציה הקלאסי, מה עם תוצאות מלוג אירועי ווינדוס חדש יותר, כמו 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.

איחזור קבצי ETW (Event Tracing for Windows) עם Get-WinEvent

אולי יש לך קובץ מיוצא *.evtx ממחשב אחר או שיש לך גיבוי של לוג קיים. תוכל לקרוא את הלוגים האלה עם ה-Cmdlet של Get-WinEvent. אם יש צורך לשמור על לוגים לצורכי אודיט, Get-WinEvent הוא דרך נהדרת לשאילת לוגים אלה עם cmdlets סטנדרטיים בתוך סקריפטים במהירות.

כדי להדגים איך לקבל רשומות יומן מקובץ *.evtx, יש צורך בקובץ יומן שיוצא.

1. פתח את מציג האירועים ונווט אל יומן. בדוגמה זו, ניתן לעבור ליומן יישומים ושירותים → Windows PowerShell.

Navigate to a Windows Event Viewer log.

2. לאחר מכן, לחץ על הפריט שמור את כל האירועים כ… בתפריט פעולות.

Save the log file.

3. שמור את הקובץ במיקום בדיסק שבו יתבצע קריאה על ידי הפקודה Get-WinEvent.

Choose a location to save the log file.

עכשיו שיש לך קובץ יומן שיוצא, מסרו את מיקום קובץ היומן דרך הפרמטר -Path כדי לקרוא את האירועים. בדוגמה המוצגת למטה, היומן של Windows PowerShell מיוצא לצרכים עתידיים.

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

אף על פי שניתן לסנן יומנים עם הפקודה הסטנדרטית Where-Object, Get-WinEvent מציע סינונים מובנים. על ידי החזרת כל התוצאות ואז סינון, עושה יותר עבודה ממה שנדרש. במקום זאת, תמיד עדיף לנסות לסנן במקור כמה שיותר.

הפקודה 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, יש להשתמש ביכולת הסינון ב-Event Viewer של 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 והעתק את החלק המכיל בתוך התג Select.

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, שהתאריך חייב להוחזר ב-UTC, שמסומן על ידי המתג -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.

סיכום

פקודת ה־Get-WinEvent עושה עבודה קצרה של יישומי שאילתות במקורות יומן אירועים מרובים עם יכולות סינון חזקות. מניפולציה עד לפתרון בעיות, פקודת ה־Get-WinEvent היא הוספה חיונית לתיקיית הכלים של מנהלי המערכת!

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