PracticU

פקודת Get-WinEvent
חלק 3 - XML

בלי כתוביותעם כתוביות
PracticU › קורס PowerShell › פקודת Get-WinEvent חלק 3 - XML
מילון מושגים:
XML - שפת סימון לייצוג נתונים מובְנים בעזרת תגיות, המשמשת להחלפת מידע בין מערכות ולקובצי הגדרות.
אירוע - התרחשות שהמערכת מזהה ויכולה להגיב לה, כמו לחיצת עכבר, הקשה או סיום פעולה.
כתובת IP - מספר שמזהה באופן ייחודי מכשיר ברשת מבוססת פרוטוקול IP, ומאפשר לשלוח אליו ולקבל ממנו מידע.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
PowerShell - סביבת שורת פקודה ושפת סקריפטים של מיקרוסופט לניהול אוטומטי של מערכות Windows ושירותים.
תהליך - מופע של תוכנה שרצה בזיכרון, עם הקוד, הנתונים והמשאבים שהוקצו לה על ידי מערכת ההפעלה.
GUID - מזהה ייחודי גלובלי: מספר ארוך שנוצר כך שהסיכוי לכפילות שלו זניח, ומשמש לזיהוי אובייקטים.

פקודת Get-WinEvent חלק 3 - XML
פירוק שדות ייחודיים של אירוע (כמו Destination IP) מתוך הודעת האירוע הארוכה, בעזרת הפיכת האובייקט ל-XML.
מדוע נדרש XML
1. הבעיה עם Message: שדות בסיסיים כמו LogName, ProcessId או MachineName ניתנים לגישה ישירה כמאפיינים, אבל שדה ה-Message - שמכיל את המידע הייחודי לכל סוג אירוע (למשל כתובות IP באירוע תקשורת) - מגיע כטקסט ארוך אחד שלא ניתן לפרק למאפיינים נפרדים.
2. הסיבה: השדות הבסיסיים זהים בכל האירועים ולכן PowerShell יודע לפרק אותם, אבל השדות הייחודיים משתנים מסוג אירוע לסוג אירוע ולכן נשארים כטקסט גולמי.
3. הפתרון - Casting ל-XML: מריצים [xml]$XML = $_ כדי להפוך את השורה הנוכחית לאובייקט XML. בתוך $XML.Event יש שני תת-מאפיינים: System (השדות הבסיסיים) ו-EventData (השדות הייחודיים לאירוע, בתוך Data).
השלבים לשליפת שדה ספציפי
1. מעבר שורה-שורה: Get-WinEvent ... | ForEach-Object { ... } (אפשר לקצר ל-%) עובר על כל אירוע בנפרד ומבצע עליו את ההמרה ל-XML.
2. סינון השדה: מתוך $EventData.Data מסננים עם Where-Object את השורה שבעמודת Name שלה מופיע השם המבוקש (למשל Destination IP), ובוחרים ממנה את עמודת #text עם Select-Object.
3. בניית אובייקט חדש: בתוך ה-ForEach-Object בונים אובייקט חדש עם מאפיינים כמו Source IP, Destination IP, Process GUID ו-Process ID, כל אחד נשלף באותה שיטה.
4. סינון כולל: בסוף מעבירים את כל האובייקטים שנבנו לפקודת Where-Object חיצונית שמסננת רק לפי Destination IP מבוקש.
שימו לב
אפשר להוסיף עוד מאפיינים לאובייקט החדש לפי הצורך. כשיש יותר מכמה עמודות הפלט מוצג כרשימה ולא כטבלה, ואז Format-Table מחזיר אותו לתצוגת עמודות.
הסטודנט יודע עכשיו להמיר אירוע ל-XML ולשלוף ממנו שדה ייחודי ספציפי שה-PowerShell הרגיל לא פירק בעצמו.
השיעור הבא בקורס: פקודת Get-WinEvent חלק 4 - Filter

פרקי ההרצאה: פקודת Get-WinEvent חלק 3 - XML

  1. 00:00

    שליפת אירועי תקשורת מיומן Sysmon

  2. 01:16

    הרצה על כל אירוע עם For Each Object

  3. 01:56

    גילוי מאפייני האובייקט עם Format List

  4. 02:56

    סינון לפי Machine Name ו-Record ID

  5. 03:35

    בעיית שדה ה-message

  6. 04:10

    המרת האובייקט ל-XML

  7. 05:06

    בידוד שדה Destination IP

  8. 05:56

    טיול בשדות ה-XML

תמלול ההרצאה: פקודת Get-WinEvent חלק 3 - XML

הטקסט המלא של הדקות הראשונות בהרצאה «פקודת Get-WinEvent חלק 3 - XML» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום לכולם, ברוכים הבאים להרצאה על PowerShell ואנחנו נעשה דוגמה על Event Viewer ודרכה אתם תלמדו PowerShell לעומק. אז קודם כל נשלוף את כל האירועים שקשורים לתקשורת מתוך יומן האירועים הנוכחי של Windows.

  2. 00:17

    דרך אגב, זה נמצא פה בממשק הגרפי Right Click Event Viewer זה אותו דבר גם ב-Windows אחד עשרה גם ב-Windows עשר. והאמת זה לא השתנה כבר מעל עשר שנים. גם ב-Windows שבע זה היה נראה אותו דבר.

  3. 00:30

    אנחנו מחפשים פה יומן של Sysmon ובתוך היומן הזה אנחנו יכולים לראות את כל האירועים. ושימו לב שיש פה הרבה אירועים. גם אירוע אחד, גם אירוע עשרים ושתיים, גם אירוע מספר שלוש עשרה.

  4. 00:43

    לדוגמה אירוע מספר שלוש עשרה זה שינוי ערך ב-Registry. אירוע מספר אחד זה הפעלת תוכנה חדשה. אירוע מספר חמש סגירה של תוכנה. אירוע מספר עשרים ושתיים שאילת ה-DNS.

  5. 00:56

    אנחנו כרגע מחפשים בתוך היומן הזה אירוע מספר שלוש בלבד שקשור לתקשורת, אבל אנחנו לא עושים את זה בממשק הגרפי. אנחנו מתחברים ליומן הזה דרך PowerShell, דרך שורת פקודה.

  6. 01:10

    אז בואו נשלוף. אנחנו שלפנו את כל האירועים ויש לנו עבור כל אירוע שורה. עכשיו אנחנו מעבירים את כל הפלט הזה דרך pipe לפקודה הבאה לביצוע והפקודה הבאה לביצוע תהיה For Each Object שרצה על כל שורה בנפרד.

  7. 01:29

    בואו נגיד לה שרק תציג לי כל שורה ובתוך השורה שהיא מציגה לי אני רוצה רק את העמודה של נניח של תאריך ושעה. זה כרגע מה שמעניין אותי. שימו לב זה מייצג לי שורה נוכחית.

  8. 01:42

    הוא רץ שורה שורה וזאת שורה נוכחית. תכף נסבך אותו, ניתן לו לעשות דברים הרבה יותר מורכבים. כרגע אני רק רוצה שתבינו שדולר וקו תחתון מסמן לי שורה נוכחית ואני אומר לו בתוך כל שורה תציג לי איזשהו מאפיין.

  9. 01:59

    כל שורה זה אובייקט ובתוך אובייקט יש מאפיין ויש מאפיין Time Created. דרך אגב, איך אני יודע איזה מאפיינים יש? אני יכול להגיד לו להציג לי קודם כל Max Events אחד שיציג לי רק אירוע אחד.

  10. 02:11

    לא צריך את כולם ועבור כל שורה שלא ידפיס לי איזשהו מאפיין ספציפי, ייקח את כל השורה ויעביר את זה לפורמט List. תצוגה ברשימה ולא בטבלה עם כוכבית עם כל השדות.

  11. 02:26

    זאת אומרת הוא הולך לקחת אובייקט אחד Event אחד, אירוע אחד ולהעביר אותו לפקודת For Each Object שעוברת על השורה האחת הזאת שיש ומציגה לי את כל השדות. ככה אני לומד דרך פורמט List כוכבית איזה שדות יש ואני רואה פה שבאירוע הזה יש קודם כל תצוגה של שורות, כי אמרתי לו פורמט List ולא פורמט Table לא עמודות כי אין מספיק רוחב במסך אז מנצלים את הגובה ואנחנו רואים שדה ראשון, קוראים לו Message שדה שני

  12. 02:56

    קוראים לו ID. לכל שדה יש שם ויש לו ערך ואני יכול לסנן לפי הערכים האלו. נניח שהייתי רוצה לסנן לפי Record ID או הייתי רוצה להציג רק Machine Name הייתי יכול לעשות את זה.

  13. 03:09

    זאת אומרת שאני יכול לקחת את כל השורות. נניח ניתן לו עשר שיציג לי עשר שורות, ועבור כל שורה אני אומר לו להציג לי Machine Name זה מה שמעניין אותי. ושימו לב, הנה הוא מציג לי על איזה מכונה קרו האירועים האלו.

  14. 03:24

    עכשיו תגידו זה מצוין. מה רע לך? נכון שזה מצוין שהוא מפרק לי את השורה לשדות נפרדים ומציג לי אותם ככה תסתכלו איזה יופי. אבל בשדה של message שהוא הכי חשוב מבחינתי יש לו סלט.

  15. 03:40

    הוא מציג לי את כל המסג הזה כשדה אחד ארוך. זה נתונים של שדה אחד בלבד של האירוע הראשון, והוא לא יודע לפרק אותם לתתי שדות לחלקים קטנים יותר. תסתכלו.

  16. 03:53

    נניח שהייתי רוצה Destination IP. מבחינתו כל זה טקסט אחד ארוך. עוד פעם לקחתי Event אחד ואמרתי לו תציג לי message והוא מציג לי את הכל ביחד. אם אני אנסה עכשיו להגיד לו נקודה Destination IP הוא לא ידע להציג לי אותו.

  17. 04:10

    אתם רואים? הוא מציג לי אותו ריק. זאת אומרת שהוא לא יודע לקחת את המסג ולפרק אותו למאפיינים של האובייקט ואני לא יכול לעבוד עם זה.

  18. 04:18

    בגלל הסיפור הזה אני צריך להפוך את האובייקט שלי ל-XML ואז XML כבר יודע לפרק את זה. אם לא היה לי את השדה של המסג, אם הכל היה לי רשום בצורה כזאת כמו פה Log Name, Process ID, Machine Name כל אחד מהשדות האלו איתם אני יודע לעבוד.

  19. 04:38

    זה PowerShell עשה לי. רק את המסג הוא לא יודע לחלק. דרך אגב, למה הוא לא יודע לחלק את המסג? בגלל שהמסג משתנה מאירוע לאירוע. זה אירוע של תקשורת, אז יש לו message מסוים.

  20. 04:50

    יש אירועים של פרוססים, יש להם message אחר. השדות המשותפים האלו הוא יודע להבין אותם, אבל את השדות הייחודיים לאירוע מסוים הוא כבר לא יודע לפרק. אז אני מפעיל פונקציה ידנית שמפרקת אותם, שזה נקרא XML.

  21. 05:06

    המטרה הסופית שלי זה לבודד שדה של Destination IP. אז הבנו שיש שדות שהם ייחודיים לאירוע מסוים, לסוג מסוים של אירועים. יש שדות שהם זהים ובסיסיים לכל סוגי האירועים.

  22. 05:20

    את השדות הבסיסיים הוא יודע לחלק למאפיינים של אובייקט. הוא יודע לתת לי לגשת לכל אחד בנפרד. השדות הייחודיים מבחינתו זה טקסט אחד גדול. זה ההיגיון מאחורי כל הסיפור הזה שאני נאלץ עכשיו לקחת שורה נוכחית.

  23. 05:37

    אתם רואים דולר נקודה. להפוך אותה ל-XML. אני גם שומר אותה במשתנה שנקרא XML וזה Format. זה אומר שאני עושה לה שינוי צורה לצורה של XML.

  24. 05:49

    בעולם של תכנות זה נקרא Casting. להפוך את זה לצורת XML. לא רק לקרוא לזה XML גם לתת לזה צורה של XML. ברגע שאני עושה את זה אני יכול לטייל בכל השדות בפנים וזה פותר לי את הבעיה.

  25. 06:02

    בואו נראה. אני עושה Get Windows Events שולף את כל האירועים. פה הם יורדים שורה אז יש צ'ופצ'יק. אפשר לא לרדת שורה ולא לשים צ'ופצ'יק.

  26. 06:11

    עבור כל שורה הם מ-מכריזים על משתנה שקוראים לו XML ושומרים פנימה את השורה הנוכחית עם XML. אני רוצה להראות לכם איך זה נראה בסוף. בסוף, בסוף יש לי בזיכרון משתנה שקוראים לו XML.

  27. 06:24

    אם אני אעשה Enter אני אראה מה שיש בפנים.

לקורס המלא: קורס PowerShell אונליין

ההרצאה הקודמת: פקודת Get-WinEvent - חלק 2

ההרצאה הבאה: פקודת Get-WinEvent - חלק 4 - Filter

הרצאות קשורות מקורסים אחרים

  • XML
  • LINQ ל- XML
  • Get Requests
  • פקודת Select

קורסים נוספים במסלול

  • קורס AWS - ניהול מכונה וירטואלית בענן
  • קורס Terraform - DevOps - Azure & AWS
  • קורס קוברנטיקס - Kubernetes
  • קורס Docker - עם Swarm Cluster
  • קורס DevOps - Ansible
  • קורס Git ו-GitHub עם Visual Studio