‏הצגת רשומות עם תוויות מדריך בסיסי ל-Powershell. הצג את כל הרשומות
‏הצגת רשומות עם תוויות מדריך בסיסי ל-Powershell. הצג את כל הרשומות

27/11/2021

חלק 10 - הרצת פקודות על מחשבים מרוחקים בעזרת (Invoke-Command) - Implicit Remoting



חלק 10 - עבודה על מחשבים מרוחקים עם בעזרת הפקודה Invoke-command

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

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

ברגע שמפעילים את ה Remoting מאחורי הקלעים קוראים הדברים הבאים:
  1. הסרוויס - WinRm מתחיל לפעול, ונהיה על מצב אוט'
  2. חומת האש של ווינדוס (אם יש לכם חומת אש חיצונית, תצטרכו לעשות את זה ידנית) תיצור חוק (Rгle) רגיל ל WsMan (מוזמנים לחפש ברשת מה זה) - ההתחברות עם PowerShell לא עובדת בערוץ מאובטח בין תחנה לשרת או בין שרת לתחנה, אז תקחו את זה בחשבון.

קצת חפירה לפני שממשיכים :) - לא מאמין שהגעתי לחלק 10 !

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

העבודה שלי על הבלוג ועם המדריכים של ה PowerShell ממש "תיכנתה" את המוח שלי בצורה חדשה לגמרי, לזכור דברים ללמוד דברים, וזה תענוג, והכל בגלל התמיכה שלכם בבלוג שלי, אני רואה יותר ויותר אנשים קוראים, מגיבים, מעודדים לכתוב עוד ועוד וזה תענוג אחד גדול !

רציתי להגיד לכם תודה רבה על הפידבקים שלכם, לא מאמין שהגעתי לחלק 10 ! מדריך שלם מ-10 חלקים !! זה אדיר ! אני מקבל הרבה מאוד פידבקים במייל שלי (אם שכחתם לרגע levl@leidertech.co.il) ותודה רבה לכם על זה ! אתם שואלים שאלות, אתם עוזרים לי גם להבין דברים ! המון תודה רבה קוראים יקרים !

"אחרי שצחקנו, נעבור לחלק האומנותי" (מתוך "גבעת חלפון אינה עונה"..)

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

תחשבו על זה רגע, במידה ואתם פותחים חיבור ישיר לשרת או למחשב או לכמה שרתים וכמה מחשבים הוא נשאר פתוח, ואם אני פותח סשן לצורך הפעלת פקודה? הסיכוי שמישהו יצליח לתפוס פאקט הוא יותר נמוך מאשר חיבור שנשאר קבוע, ככה שהרבה יותר בטוח לעבוד בו (כמובן במידה ואפשר, אם אין אפשרות אנחנו נתחבר בעזרת Enter-Pssession 
שדיברנו עליו בחלק 9 ניתן לקרוא כאן : חלק 9).

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

¿*בשביל שתוכלו לגשת למחשב מרחוק, צריך להפעיל עליו את הפקודה enable-psremoting *¿

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

Invoke-Command - בתרגום לעברית : "הפעל-פקודה" -
כמו שאנחנו מכירים ב PowerShell כל הפקודות בנויות בצורה של "מה שאתה רוצה, זה מה שאתה מקליד" אז מה שאנחנו רוצים זה להפעיל פקודה מרוחקת על מחשב, ואז לקבל את הפלט שלה (מעצבן כמה שזה פשוט נכון?) 

מבנה הפקודה עם תרגום לעברית :{הפקודה\הסקריפט שלך פה} Invoke-Command -computername -scriptblock 
הפעל-פקודה -שם מחשב -מקטע_סקריפט {הפקודה\הסקריפט שלך פה}

אז בעצם אם נרצה להריץ פקודה מסויימת על מחשב מסויים, לדוגמא, נריץ את הפקודה בצורה הבאה:

נריץ פקודה מרוחקת על מחשב בשם client1 בשביל לקבל מידע אודות ה IP שלו:

Invoke-command -computername client1 -scriptblock {ipconfig}

הפלט שנקבל:


אני אריץ את אותה הפקודה על השרת עצמו ואז תראוה שאני מקבל כתובת שונה לחלוטין:

(תשימו לב להבדל.. החלק הראשון מראה כתובת 10.0.0.11 החלק השני, מראה כתובת 10.0.0.1)



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

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

נבצע את זה בעזרת הפקודה Get-Command (כמו שלמדנו בחלקים הראשונים של המדריך), רק שאנחנו נריץ אותה על השרת מהתחנה שלנו, ונבקש להציג לי מידע שיסביר לי איזו פקודה אני צריך בשיל להציג מידע, מה שנקרא "Get":

Invoke-Command -computername cat1 -scriptblock {get-command -noun *user* -verb get}

אני אתרגם רק את החלק של קטע הסקריפט (ScriptBlock) - :
noun - שם עצם
verb - פעול

זאת אומרת, אנחנו מבקשים מ PowerShell שיציג לנו פקודה שהשם עצם שלה הוא "משתמשים" והפועל זה "קבל"\"לקבל" וכד', זאת אומרת אם אני מחבר זה יוצא בערך ככה : הצג-פקודה -שם עצם "משתמשים" -הפועל "הצג".
או בקצרה "הצג לי פקודה שהשם עצם שלה זה "משתמשים" והפעולה שאני רוצה לבצע עליה זה "הצג".

וזאת בדיוק התוצאה שנקבל מהתחנה שלנו:


לאחר שקיבלנו את המידע שאנחנו צריכים, בשביל שנראה שאני על תחנה ולא על שרת, אני אריץ את הפקודה הרלוונטית שהיא Get-Aduser ונראה שבגלל שעל התחנה שלנו אין מודול של ActiveDirectory אנחנו לא נקבל את המידע הרלוונטי וכל המסך שלנו ישפך ב"דם" (מושג PowerShell בגלל שהשגיאות בצבע אדום):



כפי שניתן לראות, המחשב שלנו לא ממש מבין מה אנחנו רוצים ממנו, והציג לנו מלא "דם", אך אם נריץ את הפקודה על המחשב המרוחק, שהוא בעצם ה Acitve Directory  שלנו נוכל לקבל פלט נורמאלי



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

נתחיל בלבדוק אילו משתמשים יש לנו על השרת ב OU שנקרא USERS בכלל:

Invoke-Command -computername cat1 -scriptblock {get-aduser -filter * -searchbase "ou=users, ou=lions,dc=linos,dc=local}|select name

הסיבה שרציתי קודם כל לבצע את הפקודה הנ"ל היא בשביל שתעלה לכם השאלה הבאה:

"למה בעצם את הפייפליין הוא שם אחריי הסוגריים ולא בפנים? הרי אנחנו צריכים רק פלט..." - שאלה מצויינת, אני שמח שאאלתם, בדיוק מהסיבה שאנחנו רוצים לקבל רק את הפלט, אנחנו מבצעים סינון לכל המידע שאנחנו מקבלים מהצד השני, ומבקשים להציג לנו במחשב רק את השדה של ה"Name":


כפי שניתן לראות, יש בשרת שלושה משתמשים, עכשיו נוסיף עוד משתמש אחד:



עוד דוגמא, הפעם אני רוצה לעשות את זה קצת יותר מעניין..

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

קודם נבדוק מה ה Scope שלנו:
invoke-command -computername cat1 -scriptblock {
Get-DhcpServerv4Scope |select -ExpandProperty scopeid |select -ExpandProperty IPAddressToString
}



במקרה שלי ה Scope הוא 10.0.0.0

לאחר מכן, נבקש מהשרת שיתן לנו 20 כתובות IP פנויות
invoke-command -computername cat1 -scriptblock {Get-DhcpServerv4FreeIPAddress -ScopeId $scope -NumAddress 20}



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

ניתן לרשום את הכל בתוך סקריפט אחד בצורה הבאה:
invoke-command -computername cat1 -scriptblock {

$scope = Get-DhcpServerv4Scope |select -ExpandProperty scopeid |select -ExpandProperty IPAddressToString

Get-DhcpServerv4FreeIPAddress -ScopeId $scope[0] -NumAddress 20

}





עד כאן להפעם, כמו תמיד תודה רבה שקראתם.

המייל שלי לכל שאלה: levl@leidertech.co.il

כמו תמיד, סרטון מצולם:

11/11/2020

מדריך ל PowerShell בעברית חלק 6 - עבודה עם רגיסטרי




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

ככה שקודם כל תעברו על המדריכים הקודמים:

לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן
לפורום בנושא באתר devhub.co.il כאן

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

[reg query HKCU\Software\[PATH_TO_MY_DIR] /v [KEY_NAME

ב PowerShell זה נראה כך:

\Get-ItemProperty HKCU:\SOFTWARE\Google\Chrome

ממש כאילו אתם משתמשים בסייר קבצים בשביל לסייר בין תיקיות, ולמה זה? זה תודות ל - Psproviders, ומה זה בעצם?  מדובר ב"מתאם" שהופך חלקים מסויימים של המידע ל"כונן דיסק" ובעצם מיצר PsDrives , ו PsDrive הוא PowerShell Drive - שזה למעשה סוג של מידע - שמותאם\ממופה ונראה כ"כונן דוסק" שאנחנו מכירים ורואים ב CMD, מה שמאפשר לנו לגשת לכל מיני מקומות במערכת הפעלה בצורה של סייר קבצים, כמו לדוגמא אפשרות לגשת לרג'יסטרי בהיררכיה של ספריות או למפות אותו לאות כונן ולהשתמש בפקודה כמו Dir, CD וכד'.

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

מי שרוצה לקרוא יותר על האופציות של ה Providers\PsDrives - מומלץ לקרוא באתר של מיקרוסופט: כאן


איך עובדים עם הריגסטרי ב PowerShell?

1. נתחיל עם השאלה הכי חשובה - איך לסייר ברגיסטרי כאילו זאת תיקייה רגילה ?

אני מאוד שמח ששאלתם, קודם כל בשביל להבין אילו ל Psdrives יש, אפשר לגשת, נריץ בקונסול את הפקודה:
Get-PSDrive



בתוצאה שנקבל, נראה לאילו נתונים ניתן לגשת, אותנו מעניין הרגיסטי, אנחנו יכולים לגשת ל
1) HKEY_LOCAL_MACHINE - בקונסול (חלון ה PowerShell) נשתמש בקיצור - hklm
2) HKEY_CURRENT_USER - בקונסול (חלון ה PowerShell) נשתמש בקיצור hkcu

בכל מפתח ניתן להוסיף את הערכים הרגילים שאנחנו מכירים מהרגיסטרי (כמה לדוגמא):

1) REG_SZ
2) REG_DWORD 
3) REG_MULTI_SZ

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





ישנן כמה דרכים לגשת לתוך הערכים של הרגיסטרי, הראשונה, להשתמש בפקודות הרגילות של ה"דוס" כמו cd בשביל לגשת לאיזשהו ענף ברגיסטרי ואנחנו נעשה את זה בצורה הרגילה שאנחנו מכירים -  :cd hklm

לאחר מכן נקבל מצב מאוד מוכר לכולנו - כאילו אנחנו נמצאים בכונן מסויים : 
<\:PS HKLM
:בערך כמו
<c:\users\lev
ועכשיו החלק הכי מעניין, אם נריץ את הפקודה שלומדים בכיתה א' לאנשי Microsoft שהיא dir או בהקבצה א' של לינקוס שהיא ls, נקבל את מה שאנחנו מכירים, תצוגה של התיקייה, או במקרה הזה את הרגיסטרי שאנחנו מכירים מהממשק הגרפי של מיקרוסופט (אל תתיחסו להודעת השגיאה): 




השלב הבא, כפי שכבר ניחשתם, יאפשר לנו פשוט להכנס לכל תיקייה כמו שאנחנו רגילים בדוס, או באחת הפקודות של PowerShell, לדוגמא נכנס ל Software (אל תשכחו שניתן להשתמש ב TAB לצורך השלמה אוט'): 

PS HKLM:\> cd .\SOFTWARE
ואם נקיש עכשיו dir, נקבל את התוכן, כמו שאנחנו רגילים בדוס:



בפקודות של PowerShell יש כמה וכמה פקודות שמקבילות ל cd, כמו שלמדנו בפרקים הקודמים ניתן להשתמש בפקודה get-alias בשביל לבדוק מה מקביל לפקודות שאנחנו מכירים:





 זאת אומרת שאם נרצה להציג את הענף software נוכל לכתוב גם set-location .\software ונגיע לאותו המקום:



2. הצגת ערכים של "מפתחות רגיסטרי" רגיסטרי.

ישנם כמה דברים שניתן להציג: 

א. את המפתח (key) עצמו ואת מה שמתחתיו (Subkey) בעזרת הפקודה - Get-Item
לדוגמאGet-item HKLM:\SOFTWARE\7-Zip


ב. ערך של המפתח ואת מה שהערך מחזיק בתוכו בעזרת הפקודה- Get-ItemProperty
לדוגמאGet-ItemProperty HKLM:\SOFTWARE\7-Zip

ג. ערך ספציפי בתוך קי (Key) מסויים בעזרת הפקודה - Get-ItemPropertyValue
לדוגמא: Get-ItemPropertyValue HKLM:\SOFTWARE\7-Zip\ -Name path64



לצורך הדגמא נגיד ונרצה לדעת מה יש תחת הערך 7zip, פשוט נריץ את הפקודה הבאה :


Get-Item HKLM:\SOFTWARE\7-Zip

ונקבל את התוצאה הבאה :


וכמובן שברגיסטרי הרגיל אנחנו נראה את אותו הדבר:


3) הוספת מפתחות וערכים חדשים

הוספת המפתחות היא קצת יותר מסובכת מאחר וקודם כל יש ליצור את המפתח (key) עצמו ורק לאחר מכן את הערך שלו וההגדרה של הערך:

לדוגמא: ניצור תחת Software את המפתח LeiderTech וניצור ערך מסוג REG_SZ ונרשום בו Lev1 וניצור עוד אחד בשם Lev2 וניצור ערך מסוג dWord וניתן לו את הסיפרה 1

אז נתחיל ביצירת המפתח במקום הרצוח:

New-Item HKLM:\SOFTWARE\LeiderTech

יצרנו את המפתח הרצוי:



לאחר מכן ניצור את הערכים הרצויים בתוך המפתח:

יצירת סטרינג - REG_SZ:

New-ItemProperty HKLM:\SOFTWARE\LeiderTech\ -Name Lev1

יצירת ערך Dword:

"New-ItemProperty HKLM:\SOFTWARE\LeiderTech\ -Name Lev2 -Value 1 -PropertyType "Dword


התוצאה של כלל הפקודות ביחד:


4. שינוי של מפתחות וערכים ברגיסטרי (לא השם של הערך, אלה הערך עצמו)

שינוים ב PowerShell מתבצעים בעזרת פקודות שמתחילות בפועל "set", מי שקרא את החלקים הראשונים של המדריך (במידה ולא - כדי מאוד לקרוא - ישלים לכם הרבה ידע !)  יודע שניתן להריץ את get-command ולקבל את כלל הפקודות הרלוונטיות אז נריץ את הפקודה הקצת ארוכה הזאת:

Get-Command -Noun Item,ItemProperty,ItemPropertyValue |Sort-Object -Property Name |select name




לצורך שינוי הערך, נשתמש בפקודה Set-ItemProperty ובעצם נבצע רק את השינוי המינורי שהוא ההתחלה של הפקודה מ New ל Set, ולאחר מכן נמחק את הערך Dword בסוף מאחר ואנחנו רוצים רק לשנות את הערך:

Set-ItemProperty HKLM:\SOFTWARE\LeiderTech\ -Name Lev2 -Value 258

וכמובן התוצאה בהתאם :





5. מחיקת מפתחות וערכים

המחיקה היא גם כן באותה הצורה, רק לשנות את ההתחלה בהתאם למה שאתם צריכים - במקרה הזה נמשתמש ב Remove בשביל למחוק את כל המפתח LeiderTech מהרגיסטרי:

Remove-Item HKLM:\SOFTWARE\LeiderTech\ -Force

הוספתי את הפרמטר Force בסוף עלמנת שלא יקפצו לי כל מיני "האם אתה בטוח?" למיניהם.


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


בדקתי את זה על אופיס 2016 - תהנו:

(ניתן לעשות "העתק" - "הדבק" לתוך ה ISE ולהשתמש)

## ==============================================
 office global Active X configuration##
## ==============================================

new-item "HKCU:\\Software\Microsoft\Office\Common\Security"
New-ItemProperty "HKCU:\\Software\Microsoft\Office\Common\Security" -name UFIControls -value 1  -PropertyType "DWord"
New-ItemProperty "HKCU:\\Software\Microsoft\Office\Common\Security" -name DisableAllActiveX -value 0  -PropertyType "DWord"


## ==============================================
## Excel configuration##
## ==============================================


#Enable macros in Excel##

Set-ItemProperty -Path "HKCU:\\Software\Microsoft\Office\16.0\Excel\Security" -Name "VBAWarnings" -value 1
New-ItemProperty "HKCU:\\Software\Microsoft\Office\16.0\excel\Security" -name AccessVBOM -value 1  -PropertyType "DWord"

#Trusted Locations in Excel:#

Set-ItemProperty -Path "HKCU:\\Software\Microsoft\Office\16.0\Excel\Security\Trusted Locations" -name "AllowNetworkLocations" -value 1


#Disabel protected view in Excel#

New-Item "HKCU:\\Software\Microsoft\Office\16.0\Excel\Security\ProtectedView"
New-ItemProperty "HKCU:\\Software\Microsoft\Office\16.0\Excel\Security\ProtectedView" -name DisableAttachmentsInPV -value 1  -PropertyType "DWord"
New-ItemProperty "HKCU:\\Software\Microsoft\Office\16.0\Excel\Security\ProtectedView" -name DisableInternetFilesInPV -value 1  -PropertyType "DWord"
New-ItemProperty "HKCU:\\Software\Microsoft\Office\16.0\Excel\Security\ProtectedView" -name DisableUnsafeLocationsInPV -value 1  -PropertyType "DWord"


## ==============================================#
## Word Configuration#
## ==============================================#


#Enable macros in Word#

New-ItemProperty "HKCU:\\Software\Microsoft\Office\16.0\word\Security" -name AccessVBOM -value 1  -PropertyType "DWord"
New-ItemProperty "HKCU:\\Software\Microsoft\Office\16.0\word\Security" -name VBAWarnings -value 1  -PropertyType "DWord"

#Trusted Locationsin word:#

Set-ItemProperty "HKCU:\\\Software\Microsoft\Office\16.0\Word\Security\Trusted Locations" -name "AllowNetworkLocations" -value 1


#Disable protected View in Word#

New-Item "HKCU:\\Software\Microsoft\Office\16.0\word\Security\ProtectedView"
New-ItemProperty "HKCU:\\Software\Microsoft\Office\16.0\word\Security\ProtectedView" -name DisableAttachmentsInPV -value 1  -PropertyType "DWord"
New-ItemProperty "HKCU:\\Software\Microsoft\Office\16.0\word\Security\ProtectedView" -name DisableInternetFilesInPV -value 1  -PropertyType "DWord"
New-ItemProperty "HKCU:\\Software\Microsoft\Office\16.0\word\Security\ProtectedView" -name DisableUnsafeLocationsInPV -value 1  -PropertyType "DWord"




כמו תמיד, לכל שאלה המייל שלי levl@leidertech.co.il

ומדריך מצולם:




לחלקים הקודמים:

לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן
לפורום בנושא באתר devhub.co.il כאן

13/08/2019

מדריך ל Power Shell בעברית חלק 3 - הרחבה של סינונים ומיונים.



חלק 3


שלום - במידה ולא קראת את החלק הראשון והשני של המדריך אין לך טעם להמשיך לקרוא, אנא עבור על החלק הראשון והשני של המדריך:

לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן
לפורום בנושא באתר devhub.co.il כאן

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

מאמר זה יתמקד אך ורק ב - 3 פקודות הסינון ב PowerShell

1) select-object
2) where-object
3) group-object


מיונים, מיונים, מיונים

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

לצורך ההדגמה אני צריך פקודה עם הרבה עמודות, אני אקח את get-process שיציג לי את התהליכים של הדפדפן אינטרנט גוגל כרום, אז נבצע את זה בצורה הבאה: get-process -name chrome (שימו לב, ניתן גם לקבל פלט בלי הפרמטר Name אבל מאחר ואתם רק בהתחלה, מאוד ממליץ לא לעשות קיצורי דרך ולהשתמש בכל הפרמטרים שאתם יכולים, על מנת שהמוח שלכם יזכור את הפעולות והפרמטרים בצורה טובה יותר) 


נקבל את הפלט הבא:


get-process -name chrome



לאחר מכן  אני אריץ את אותה הפקודה עם הפרמטר get-member בשביל לבדוק אילו עמודות אני יכול להציג

get-process -name chrome |get-member



קיצרתי את הרשימה, לצורך ההדגמה אבל ישנם גם Methods שאילו הם בעצם פעולות שניתן לבצע על האובייקט (זאת אומרת, להפעיל, לסגור, להרוג תהליך וכד'), עמודות כפי שלמדנו במדריכים הקודמים נקראים Properties וגם ה Alias Properties הם עמודות, רק שהחליטו לקצר להם את השם, אז במקרה הזה אני ארצה להציג את ה:
Processname, ID ,Responding:

אז בעצם הפקודה שלנו תראה כך:

get-process -Name chrome |Select-Object Processname,ID,responding

(שימו לב, בחלק השני של הדוגמא - ניתן לראות את הפקודה הנ"ל ללא שימוש ב- Select-object)


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



להלן הפקודה עצמה: 
Get-Process chrome |Select-Object @{label='Shnitzel_levs_test' ; expression='Id'}, ProcessName

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

(לי אישית זה הפריע שהפקודה בנויה הפוך - קודם השם שאתם רוצים לתת לפלט ואחרי זה בחירת העמודה, אבל בסוף מתרגלים)

במקרה של הדוגמא הנ"ל ביצעתי שינוי לעמודה Id וקראתי לה בשם Shnitzel_levs_test

*  הפרמטר "Label" - מסמן את השם שאנחנו רוצים לתת 
* הפרמטר " Expression" - מסמן את העמודה שאנחנו רוצים לשנות

ניתן לקצר ולכתוב אך ורק את האותיות ההתחלתיות "l" ו האות " e" מה שיגרום לפקודה להיראות ככה:

Get-Process chrome |Select-Object @{l='Shnitzel_levs_test' ; e='Id'}, ProcessName

במידה וקשה לכם לזכור, ניתן לעשות את זה בצורה יותר נוחה (הכל תלוי בכם):

ניתן להחליף את האות "l" (האות L בקטן)  בתוך @{l='Shnitzel_levs_test' ; e='Id'} באות "N" (קטנה) או לשם שינוי לכתוב את המילה "name" ותקבלו את אותה התוצאה, כמו כן כמו בכל הפעמים את ה סימן "._$" ניתן להחליף במילה Psitem$ וגם כאן תקבלו את אותה התוצאה.

Get-Process chrome |select @{n='Shnizel_levs_test';e={$_.Id}},ProcessName

Get-Process chrome |select @{name='Shnizel_levs_test';e={$PSItem.Id}},ProcessName



התוצאה תהיה זהה.



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

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




פרמטרים השוואתיים

-eq שווה ל
-ne לא שווה ל
-gt גדול מ
-ge גדול מ או שווה ל
-lt קטן מ
-le קטן מ או שווה ל

פרמטרי התאמה

-like - *.txt הצג תוצאות אשר דומות למחרוזת הכתובה (טקסט) ניתן להתמש ב"וייל קארד" - לדוגמא 

Get-Service bits |Where-Object status -Like running

-notlike - *.txt הצג תוצאות אשר  לא דומות למחרוזת הכתובה (טקסט) ניתן להתמש ב"וייל קארד" - לדוגמא 

Get-Service bits |Where-Object status -NotLike running

-match - הצג תוצאות אשר המחרוזת מתאימה לערך מסויים

Get-Service bits |Where-Object status -Match running

-notmatch - הצג תוצאות אשר המחרוזת לא מאימה לערך מסויים

Get-Service bits |Where-Object status -NotMatch running

¿?יש עוד המון פרמטרים לפקודה הזאת את כולם ניתן לראות באתר של מיקרוסופט כאן¿?

כפי שהזכרנו למעלה, ניתן להשתמש בפקודה הזאת בסינטקס פשוט ובסינטקס "מורכב" יותר 
דוגמא לסינטקס פשוט: 
"Get-Service  bits |Where-Object status -eq "running

דוגמא לסינטקס ה"מורכב" :

{"Get-Service bits |Where-Object {$_.status -eq "running


מה המשמעות של הסימן הזה "._$" בפקודה Where-object? 
 ובכן לצורך ההבנה, אנחנו נפרק את ההסבר על הפרמטר הזה ל-2, החלק הראשון הוא הסבר על הסימן של ה "._$" ולאחר מכן נוסיף את ה "." והמילה "status".

ניקח לדוגמא את הפקודה get-services, הפקודה הזאת מייצרת המון שורות והמון עמודות, במקרה הזה הסימן "_$" מיצג כל שורה שעוברת בתוך הפייפליין, למי שנוח בתור התחלה יכול גם להשתמש במילה psitem$ ואז הפקודה תיראה ככה {"where-object {$psitem.status -eq "running

לאחר הסימן של ה "_$" מתווספת גם ה "." והמילה "Status", המשמעות היא מאוד פשוטה, ועכשיו זה יתחבר לכם עם החלק הראשון, במקרה הזה, אני רוצה לראות אך ורק את העמודה בעלת השם Status מכל התוצאות, ואז בעצם הפקודה תתפרש ככה: "הראה לי מתוך התוצאה של get-service רק את העמודה "Status" בעלת הערך "running", ואם נעשה "Reverse Engineering" נקבל את זה ככה:

{"get-service bits |where-object {$psitem.status -eq "running

לצורך הדוגמא, הרצתי את כל האופציות על מנת שתבינו:



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

לצורך דוגמא - להלן סקריפט שאני משתמש בו לבדוק האם כתובת IP מסוימת נמצאת ב Reservation בשרת ה DHCP שלי:

"Write-Host " this scrip will check if any ip is reserevd on the local DHCP

Get-DhcpServerv4Scope |select Name,@{l='Scope' ; e='ScopeID'}, StartRange, EndRange |ft -AutoSize

"scopes = Read-Host " what is the Ip Adress that you want to search? - enter ipadress$

Get-DhcpServerv4Reservation -ComputerName $env:COMPUTERNAME -ScopeId $scopes |

הפקודה בשילוב הסקריפט ->         {"*Where-Object {$_.IPAddress -like "*$scopes |
        
Select-Object IPAddress, ScopeId, Description |ft -AutoSize

        
        pause




group-object - מאפשר לבצע קיבוץ של התוצאה לפי שמות של עמודות, או שמות האובייקט וכד'.

להלן 2 דוגמאות :

1)  Get-Service -Name bits, wscsvc,winrm |Group-Object status, displayname

2) Get-Service -Name bits, wscsvc,winrm |Group-Object DisplayName, status







מדיך מצולם :





עד כאן להפעם.
המייל שלי לכל שאלה
 :
levl@leidertech.co.il

אל תשכחו לתת לנו לייק בדף הפייסבוק - חפשו LeiderTech.

לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן
לפורום בנושא באתר devhub.co.il כאן

25/11/2018

מדריך ל PowerShell בעברית חלק 2 - מיונים, מודלים ו-Alias.


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

אל תמשיכו לקרוא את החלק הזה של המאמר כל עוד לא עברתם על החלק הראשון -
לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן

לפורום בנושא באתר devhub.co.il כאן


אז ללא יותר מדי חפירות, נתחיל.

מאמר זה שהוא החלק השני של המדריך,נלמד לבצע מיון לפלט, נלמד אודות מודלים, ה- PipeLine ומה הם Aliases ב-Power Shell.

ה - Power Shell – מצויין למיונים, אפשר לבצע סינון עד לרמת אובייקט, תתארו לעצמכם שבפקודה אחת אתם יכולים לשלוף Event מתוך רשימה של 200-לוגים וגם לקרוא את הכל באותו חלון של שורת הפקודה, ולכן אנחנו נלמד את האופרטורים (Operators) שהם לצורך סינון (Filter) ומיון, נעבור אל Pipeline מאפשר לנו לשרשר פקודות ממש כמו "פס יצור" שמריץ מוצרים וכל תחנה עושה בו שינוי כזה או אחר, וכמובן נלמד קצת על מודולים.


מיונים, מיונים, מיונים
1) Format-Table.

Format-table – היא, כשמה כן היא, פקודה שממיינת לכם את הפלט בצורת טבלה, אם אני מציג תוכן רב הייתי רוצה לראות אותו בצורה שאני אצליח לקרוא אותו, אז אני אצטרך להעביר את הפקודה דרך ה PipeLine (עליו נרחיב בפסקה יעודית לנושא בהמשך המאמר), לתוך format-table לדוגמא get-service |format-table ואם אני רוצה שהמערכת תתאים את התצוגה למסך שלי ותיתן לי לקרוא את הפלט בצורה נוחה יותר, אני יכול להוסיף בסוף את
הפרמטר “autosize-”

ללא פרמטר AutoSize:


עם פרמטר AutoSize:


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


2) Sort-Object.

Sort-object - מיון של אובייקטים לפי מצב או לפי עמודה (property) מסוים, לדוגמא, הריצו את הפקודה get-service, אתם תראו שתקבלו המון מידע, אבל מה קורה אם אני רוצה לראות את זה בצורה מסודרת, לפי מה פעיל ומה לא פעיל?





3) Group-Object

Group-object – ניתן לקבל פלט ולמיין את הפלט לפי קבוצה, לדוגמא נמיין את הסרוויסים שלנו לפי סטטוס בלבד: Get-Service|Group-Object -Property Status


4) Where-object.

Where-Object  - מדובר במסננת לכל היותר, בעזרת הפקודה הזאת אפשר לבצע סינון של Property שמתקבלים מתוך הפייפליין (אנחנו נלמד עליו בפיסקה הבאה).
Where-object הינה פקודת סינון תוצאות או תצוגה (תקראו לזה איך שנוח לכם, העיקר שתזכרו את זה), לצורך דוגמא נריץ את הפקודה get-hotfix (פקודה שמציגה לנו עדכוני מערכת, כרגע לא משנה הסדר שבו זה יוצג או האם זה רלוונטי או לא) כמובן שנקבל המון מידע:


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

נתחיל עם הדרך הפשוטה: *Get-hotfix |where-object hotfixid –like kb44

הפרוש של הפקודה היא "הצג לי את כל עדכוני המערכת שמתחילים ב Kb44" ובהתאם לכך בעצם גם התוצאה:


עוד דוגמא ל where-object:

נגיד ואנחנו רוצים לראות את הפרוססים שרצים לנו במערכת, נריץ את הפקודה get-process וכמובן שנקבל המון מידע, לדוגמא:

ואני מעוניין לראות נגיד רק את הפרוססים של הכרום:
'*Get-process | where-object Processname –like '*chrome

                   • חשוב לזכור, את הסינון ניתן לעשות לפי כל עמודה שמופיעה, כמו כן, ישנן עמודות גם שלא מופיעות על מנת שנוכל לראות עד אפשרויות לסינון, נריץ את get-process דרך Get-member  ואז נוכל לראות לפי אילו עוד אפשרויות ניתן לבצע סינון, מאחר והרשימה היא מאוד ארוכה (ניתן לראות  Property וגם Methods שניתן להשתמש בהן) אני לא אצלם כאן את המסך, עדיף שתנסו לבד.

                    • עוד טריק שמראה עד כמה בנו את ה Power Shell בצורה חכמה, לאחר שהקלדתםWhere-object אם תתחילו ללחוץ על TAB תקבלו את אפשרויות שלפיהן אפשר יהיה לסנן – מאוד נוח כשלא בטוחים.לאחר שהרצנו את הפקודה, נקבל רשימה של כל הפרוססים שהם כרום:



ישנן כמה דרכים להשתמש בפקודה where-object, האחת היא הפשוטה (יותר ברורה לאדם) והשניה היא יותר מסובכת אבל כעקרון יותר "אפקטיבית" למחשב ומאפשר לשרשר פקודות בצורה יותר טובה, איתה גם ניתן לשרשר פקודות בצורה יותר יעילה:
{'*Get-process | where-object –filterscript {$_.processname –like '*chrome

הסימן "_$" - מיצג כל אובייקט בתורו, זאת אומר מאחר ואנחנו מריצים פקודה שתיתן לנו רשימה של מלא פרוססים, אז אנחנו רוצים להעביר בתוך הפקודה שלנו כל פרוסס בתורו, ניתן לרשום גם PSItem$ ונקבל את אותה התוצאה זאת אומרת הפקודה תראה כך:

{'*Get-process | where-object –filterscript {$PSitem.processname –like '*chrome

במקרה זה נקבל את אותה התגובה מהמחשב.

לידע כללי:
להמון פקודות ב – PowerShell יש אליאס (כינוי) שניתן לרשום בצורה שונה, בשביל שנוכל לראות את כל ה Alias שיש ל Power Shell להציע, נריץ את הפקודה get-alias, כמובן שנקבל פלט ענק ששם נוכל לראות את כל הרשימה, במקרה של where-object נקבל 2 קיצורים לפקודה, האחד where והשני "?" 
(בהמשך המאמר ישנו הסבר קצת יותר מפורט על Aliases)



זאת אומרת את הפקודה היותר פקודה של where-object אפשר יהיה לכתוב בצורה הזאת:
get-process |? Processname –like '*chrome*'

ונקבל את אותו הפלט:


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

ישנן המון אפשרויות לסינון, המסננים נקראים Comparison Operators, ניתן לקרוא עליהם ברשת ובחיפוש ב Power Shell, עדיף כמובן ברשת על ידי ביצור חיפוש של
About Comparison Operators.



"הצינור" – PipeLine

לא אני לא עושה שום פרסומת לתוכנית בערוץ 10, למי שיצא לעבוד עם Linux מכיר את ה" PipeLine" טוב מאוד, הסימון שלו הוא "|" והוא נמצא בדרך כלל מעל מקש ה  Enter אצלכם, אם תלחצו על Shift ועל המקש הזה תקבלו את ה"PipeLine", בגדול מה שזה מאפשר לעשות הוא לשרשר פקודות, זאת אומרת אם אני רוצה לדוגמא לראות אילו עמודות אני יכול לראות כשאני מריץ את get-process, אני "אעביר" אותו דרך "צינור" לפקודת ה get-member  ואז אוכל לראות את כל הפעולות שאני יכול לעשות עם האובייקטים שיוצגו, כולל עמודות (Property) שאני יכול להציג, ו"Methods" (נלמד עליהם בהמשך) וכמובן גם ה Aliases המתאימים.
 
הפקודה נראית כך
get-process |get-member

מאחר והפלט הוא מאוד ארוך, אציג כאן רק חלק

משימה שניה: נסו לחשוב על פקודות שיכולות להציג לכם פלט עם הרבה מידע ורשימות כמו רשימת ה – Process ורשימת ה-Services והעבירו אותם דרך ה-Pipeline לפקודה format-table –autosize.

לדוגמא, פקודה להצגת עדכוני מערכת, אני ארצה להציג אותם בצורה של טבלה ובשביל לראות את הכל בצורה שמתאימה
למסך שלי, אני גם ארצה שה  Power Shell יתאים את זה לתצוגה שלי:
בשביל להציג עדכוני מערכת נשתמש  ב-CmdLet   שנקרא get-hotfix וכפי שנתנו דוגמא במשימה, נשתמש ב CmdLet שנקרא format-table ונגיד לו תתאים לבד את התצוגה בעזרת הפרמטר "-autosize"

מבנה הפקודה: get-hotfix –computername localhost|format-table –autosize



Alias 

כן, גם כאן יש לנו Alias (כינוי) שבעצם אפשר להשתמש בו לדוגמא, אם אני רוצה לעשות העתקה של קובץ אז אני יכול להשתמש ב Cmdlet "copy-item" אבל אני יכול להשתמש גם ב"cp" (השתמשתם ב –Linux פעם? אז כן, זה אותו הדבר כמו שם) אם תרצו לראות את כל ה-Aliases תוכלו להריץ את הפקודה Get-alias (לא משנה אם זה באותיות גדולות או קטנות) ותקבלו רשימה של כל ה Aliases שיש ב  Power shell בהתאם ל Module שמותקים אצלכם ב  Power Shell.

אם אני רוצה לסנן ולראות את כל פקודות ה-Get, אני יכול להריץ get-alias g* ואז אקבל את כל הפקודות שמתחילות ב Get שזה בעצם כל ה-CmdLets.

אם אני רוצה לקבל קיצור של איזושהי פקודה אני יכול להריץ get-alias -definition get-process  ואז אקבל בדיוק את המידע שאני צריך, כמו כאן בדוגמא, רציתי לברר מה ה- Alias של get-process אז אני בעצם "שואל" את ה Power Shell והינה הפלט:


במידה ואני רוצה לקבל Alias של פרמטר מסויים (נגיד ואני רוצה לדעת מה הקיצורים של כל הפרמטרים של הפקודה Get-process), אני אריץ את הפקודה הבאה:

(Get-Command Get-Process).Parameters.Values| Where-Object aliases |Select-Object name,aliases

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


Modules

מודלים הם בעצם "תוספים" שמאפשרים לכם לעבוד עם Power Shell בהתאם למה שאתם מעוניינים לעשות, כל Module מוסיף רשימה של פקודות ופונקציות כאלה ואחרות, לדוגמא בשביל לנהל את 
ה- Active Directory דרך Power Shell, נצטרך מודול שנקרא Active Directory Module שיהיה מותקן לכם כחלק מ RSAT או שכמובן יהיה מותקן על שרת ה DC עצמו.

בשביל לראות אילו מודלים מותקנים לנו ב Power Shell נריץ את הפקודה:

Get-Module –ListAvailable

תיקחו בחשבון שתקבלו רשימה מאוד ארוכה כמובן, מכיוון שישנם הרבה מודולים שמותקנים אצלכם

לאחר שהרצתי את הפקודה על שרת ה DC שלי להלן הפלט:



כפי שניתן לראות, מודול ה Active Directory מותקן על שרת ה DC מה שיאפשר לי לנהל אותו משורת הפקודה.

שימו לב - גירסה יותר עדכנית, תביא איתה יותר פקודות

ב Power shell האחרון שהוא בגירסה 5.1 ישנו סט מאוד גדול של פקודות שנוסף מאז הגירסה הראשונה ולכן כדי לעדכן לגירסה האחרונה (בשביל לבדוק את הגירסה המותקנת אצלכם, הריצו את הפקודה: host
להלן הפלט :



ניתן לעדכן לגרסת ה- Power Shell מהאתר הרשמי של מיקרוסופט: PowerShell 5.1

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






עד כאן להפעם.

לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן
לפורום בנושא באתר devhub.co.il כאן

 לשאלות המייל שלי :
levl@leidertech.co.il