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

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

20 תגובות:

  1. ראיתי את כל המדריכים, עזרת לי המון תודה רבהה

    השבמחק

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

תודה :)