
Get-WinEvent, הפעם על קבצי יומן ששמורים בדיסק (evtx) וסינון אירועים לפי מספר אירוע ולפי תאריך..evtx. אפשר גם להגדיר ליומן Archive the log when full כדי לשמור אוטומטית כל עומס קודם לקובץ נפרד במקום לדרוס אותו (Overwrite, שהיא ברירת המחדל).Get-WinEvent -Path <נתיב> עם -MaxEvents שולפת אירועים אחרונים מתוך קובץ במקום מהיומן החי.-FilterHashtable עם LogName ו-Id (אפשר כמה ID-ים), כך שהסינון מתבצע כבר בשלב השליפה - השיטה המהירה.$_.Id -eq 1 -or $_.Id -eq 3). Where-Object עובד תמיד, גם כשלפקודה הקודמת אין אפשרות סינון מובנית.$StartDate ו-$EndDate עם Get-Date, ומעבירים אותם ל-FilterHashtable כ-StartTime ו-EndTime כדי לשלוף אירועים מתוך טווח זמן מסוים.הטקסט המלא של הדקות הראשונות בהרצאה «פקודת Get-WinEvent חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, היום בהרצאה אנחנו נמשיך עם פקודות PowerShell והפעם ניקח את האיבנטים, את האירועים מתוך הקבצים ששמורים בדיסק. לדוגמה מהתיקייה הזאת. הקבצים האלו נוצרו על ידי Event Viewer.
בואו נראה איך עושים את זה. אנחנו באים ל-Windows, לוחצים Right Click Event Viewer. זה יכול להיות Windows עשר, אחד עשרה, זה לא משנה, וכשאנחנו עומדים על אחד היומנים אנחנו יכולים לעשות Right Click Save All Events As ולשמור אותם בקובץ חיצוני.
קובץ evtx זה הקובץ החדש, הפורמט החדש שלו, ואני שומר את כל האיבנטים, את כל האירועים, בקובץ חיצוני. דרך אגב, Event Viewer יודע לעשות את זה לבד אם במאפיינים של יומן מסוים כתוב לו Archive the log when full.
כשהלוג מגיע למקסימום שלו תעשה לו Archive. מה זה Archive? תשמור הכל בקובץ חיצוני. כרגע הוא שומר הכל בקובץ הזה. ברגע שזה מגיע לעשרים מגה הוא שומר את זה בקובץ אחר, מנקה את הקובץ הנוכחי ויש לנו את כל ההיסטוריה שמורה, אבל זאת לא ברירת מחדל.
ברירת מחדל זה Overwrite. כל פעם לדרוס את הקובץ הזה עם אירועים חדשים כדי שלא יתפוס בדיסק יותר מעשרים מגה. יהיו לנו רק עשרים מגה של אירועים אחרונים. אוקיי, אז עכשיו אנחנו רוצים לעבור על הקבצים האלו ששמורים בדיסק ולחפש שמה מידע.
בואו ננקה מסך, cls. נצא לתיקייה הראשית cd סלאש. cls זה קיצור של פקודה מלאה שנקראת clear host, כי זה התקן. פעולה, מקף, על מי עושים את הפעולה הזאת.
ככה ב-PowerShell כותבים פקודות. אז clear host זאת הפקודה האמיתית. בואו נראה דוגמאות. הדוגמה הראשונה זה Get-Windows Events מתוך ה-path, מתוך מסלול מסוים.
נעתיק את הפקודה, נכניס אותה פה ונראה שאחרי ששולפים חמישה אירועים בלבד, חמישה אחרונים, מעבירים את כל החמישה בפייפ כאובייקטים לתוך פקודת Select Object, והפקודה הזאת, Select Object, בוחרת מתוך האובייקט הזה שהגיע מתוך האירוע, מתוך האיבנט, רק את השדות שביקשו.
אפשר גם לסנן, לעשות פילטר על אירועים. לא לשלוף את הכל, אלא רק אירועים מסוימים. לדוגמה עם מזהה אחד ושלוש, Event ID אחד או Event ID שלוש. בואו נראה איזה Event ID יש לנו.
יש לנו פה Event ID אחד, אירוע מספר אחד. בואו נגיד לו שישלוף לי את הכל ויציג לי את הנתונים בטבלה. Format Table. ואני רוצה לראות איזה איי-דיים יש לנו.
יש לנו רק איי-די אחד. זה איזשהו קובץ מאוד קטן. אם היה לנו פה הרבה איי-דיים, איך היינו יכולים לסנן אותם? שימו לב, אני מדבר על האיי-די של האירוע.
זה העמודה הזאת. Event ID. אתם רואים פה איי-די שש עשרה, איי-די עשר אלף ושש עשרה, כל האיי-דיים האלו. אז איך מסננים?
יש כמה שיטות. יש שיטה עם Filter Hash Table ויש שיטה יותר נוחה אבל הרבה יותר איטית. זאתי השיטה המהירה. בואו נראה את השיטה המהירה ואחרי זה אני אראה לכם שיטה יותר נוחה.
אז אנחנו לוקחים את הדוגמה שלהם שאומרת ככה: Get-Windows Events, ושימו לב, הם שמים Filter. Filter אומר רק מתוך Log Name כזה וכזה, רק מתוך יומן כזה וכזה, איבנטים עם איי-די אחד ושלוש.
זאת אומרת, הפילטר מופעל פה בתוך הפקודה Get-Windows Events ורק האירועים האלו יישלפו ויעברו לפקודת Select Object שתבחר מתוך האובייקטים את השדות שאנחנו רוצים ותעביר אותם לפקודת Format Table שתציג אותם כטבלה.
אז בואו נעבור עוד פעם על הפקודה Get-Windows Events, ומפעילים Filter Hash Table שאומר לו לשלוף את זה מתוך יומן נוכחי. שימו לב, אנחנו לא שולפים כרגע מקובץ.
זאת הדוגמה שלהם, ורק איבנטים עם מזהה אחד ושלוש. דרך אגב, היומן הזה זה של Sysmon ואנחנו באמת רואים שיש רק אירועים אחד ושלוש פה איפשהו למעלה.
אם ניכנס ליומן המלא, אם לא היינו מסננים את זה, אז היינו רואים הרבה יותר אירועים. תסתכלו, יש פה בתוך היומן של Sysmon לא רק אחד ושלוש. אתם יכולים לראות, יש פה אירועי עשרים ושתיים ושלוש עשרה.
כל אלו לא נכנסו לפילטר שלנו. דרך שנייה לכתוב את אותו הדבר, שלדעתי הדרך השנייה היא יותר נוחה אבל יותר איטית. שימו לב, אני במקום Filter Hash Table אומר לו לא לסנן כלום.
זאת אומרת לשלוף לי את כל האירועים מתוך ה-Log Name. כן, אני מוחק אות האחרונה ולוחץ Tab. הוא משלים לי. זה אומר שהכל תקין.
ולהעביר את כל האירועים בלי יוצא מן הכלל לפייפ, ובתוך הפייפ אני אפעיל פקודה Where-Object. אני מעביר את כל הפלט של היומן לפקודת Where-Object שעוברת אובייקט אובייקט, שורה שורה, ועבור כל שורה, שימו לב, זה סימן של שורה נוכחית.
עבור כל שורה היא מבצעת את מה שיש פה בסוגריים. אתם רואים? יש פה סוגריים מסולסלים. אז כל מה שקורה בתוך הסוגריים מתבצע עבור כל שורה, עבור כל Event.
הוא לוקח את השורה הנוכחית, את האיבנט הנוכחי, ובודק אם האיי-די שלו שווה לאחד. למעשה זה מסנן לי את כל האירועים עם איי-די אחד, Event ID אחד. הפקודה הזאת עובדת כמו שאתם יכולים לראות, אבל היא עובדת לאט.
למה היא עובדת לאט? כי צריך לשלוף את הכל ולהעביר את הכל לפקודה הבאה. בפילטר הקודם הוא התבצע כבר במעמד השליפה. היתרון של Where-Object שהוא עובד תמיד, גם אם הפקודה הקודמת לא הייתה תומכת ב-filtering, לא הייתה לה אופציה של Filter, במעמד השליפה היינו יכולים לסנן דרך Where-Object.
ה-Where-Object זאת פקודה שעובדת בתוך PowerShell בכל מקרה. אז היא יותר איטית אבל תמיד עובדת על כל הכלים שיש לנו ב-powershell על כל הפקודות. אפשר גם לשדרג את זה ולכתוב minus or או שזה או שהרשומה הנוכחית הסימן הזה של רשומה נוכחית ID שלה minus equals שווה לשלוש או שזה שווה לאחד או שזה שווה לשלוש.
בואו נראה.