11/04/2021

מדריך ל PowerShell בעברית חלק 9 - התחברות ועבודה על מחשבים מרוחקים עם PowerShell Remoting.


חלק 9 - התחברות למחשבים מרוחקים: PowerShell Remoting.


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

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

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


שימו לב - אם אתם בסביבה שהיא לא "דומיין" ההגדרות הרבה יותר מוסבכות.


אתחיל בכך שאומר, יש הבדל גדול בין לעבוד מרחוק על מחשבים או שרתים (זאת אומרת להתחבר אליהם) לבין לנהל אותם, למה הכוונה? נגיד שאנחנו רוצים לקבל מידע על משתמש מתוך אקטיב דירקטורי, ישנן 2 דרכים לעשות את זה ב PowerShell:
  1. PowerShell Remoting להתחבר מרחוק לשרת - לפתוח Tunnel לשרת ה AD ולעבוד עליו.
  2. Implicit Remoting - להשתמש בפקודה שתרוץ על המחשב המרוחק, תשתמש במשאבים של המחשב המרוחק ולנו תציג רק את המידע, מאפשר להריץ פקודות ממודולים שלא מותקנים על התחנה שלנו, בעזרת הפקודה
    Invoke-Command, לדוגמא להריץ get-aduser ממחשב שלא מותקן עליו בכלל שרת AD.
במדריך הונכחי אנחנו נלמד על PowerShell Remoting (האופציה הראשונה) בלבד - שאיתו נתחבר למחשבים מרוחקים ונעבוד עליהם, במדריך הבא נלמד על האופציה השניה, שימוש בפקודה בלבד ללא הצורף להתחבר למחשב מרוחק.


בתור ברירת מחדל, WinrRm מאופשר בשרתים (לדעתי כבר משרתי 2008), ולכן אם נריץ לדוגמא את הפקודה הבאה מתוך קלינט (שם השרת במקרה הזה הוא cat1 - כי אני רוסי ואני אוהב חתולים 😊, הדומיין שלי במקרה זה הוא Lions.local סתם לידע כללי 😋):
 get-services -computername cat1

נקבל פלט תקין, כמו בדוגמא:



אז PowerShell Remoting, מה זה בעצם?


מדובר במצב שבו נוכל לעבוד על שרת או תחנה מרחוק, ממש להתחבר עם סשן למחשב מרוחק ולעבוד עליו כאילו אנחנו עובדים על המחשב שלנו, ממש דומה ל RDP רק בשורת פקודה - כמו SSH.

אם נשאל את PowerShell כמה פקודות שקושורות ל Pssession יש (זוכרים את הפקודה Get-Command?) 
Get-Command -Noun PSSession

נקבל את כל הפקודות הללו:
Connect-PSSession
Disconnect-PSSession
Enter-PSSession
Exit-PSSession
Export-PSSession
Get-PSSession
Import-PSSession
New-PSSession
Receive-PSSession
Remove-PSSession


אנחנו נתמקד בכמה עיקריות:

Enter-Pssession
New-Pssession
Get-Pssession
Remove-Pssession





במידה וננסה להתחבר לתחנה שלא מאופשר בה PowerShell Remoting נקבל שגיאה שתמלא לנו את המסך ב"דם".

אם ננסה להתחבר למחשב שכן מוגדר לקבל בקשות התחברות של PowerShell נקבל שורת פקודה ואת שם המחשב המרוחק שאליו אנחנו מחוברים כמו בדוגמא הבאה:

מתחברים למחשב מרוחק בעזרת הפקודה הבאה:

enter-pssessiotn - computername cat1

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




ועכשיו אני יכול להתחיל להריץ עליו את כל מה שאני רוצה, כאילו אני עובד על השרת עצמו, בדומה ל RDP רק בשורת הפקודה, במקרה הזה אנחנו מחוברים לשרת שהוא DC, אז אפשר להריץ מהתחנה הזאת את הפקודות של ה ActiveDirectory, ואז בהתחלה PowerShell יעשה לסשן הנוכחי את המודול של ה Active Directory ואז אפשר להריץ את כל מה שאנחנו יכולים להריץ על השרת מרחוק - לדוגמא (שימו לב לשם של המחשב המרוחק שאנחנו עובדים עליו מצד שמאל, זה אומר שאנחנו לא עובדים על המחשב המקומי !):



חשוב לזכור, אם אנחנו סוגרים את חלון ה PowerShell שלנו, זה סוגר לנו את הסשן

אם נרצה להתחבר למחשב מרוחק שעליו לא מוגדר ה PowerShell Remoting, נקבל את השגיאה הבאה:


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

אז קיימות שני דרכים: 
1. במידה ויש לכם גישה למחשב היעד - לפתוח PowerShell בתור אדמין ולהריץ את הפקודה: Enable-PSRemoting
2.לאפשר דרך Group Policy.
3. במידה ואין לכם גישה למחשב היעד - יש עוד דרך אבל היא מסובכת קצת ואני לא רוצה לבזבז את הזמן על זה, תכתבו לי בתגובות אם אתם רוצים לדעת כיצד לבצע את הדרך המסובכת, ואם יהיו מספיק תגובות, אני אצור מדריך יעודי לזה.

אנחנו נתמקד באופציה הראשונה, נפתח את PowerShell בתור אדמין ונריץ שם את הפקודה Enable-PSRemoting, מה שיקרה, זה ש PowerShell יגדיר את כל מה שצריך באופן אוט' (כמו שניתן לראות, הגדרות בחומת האש של התחנה, הגדרות של הסרוויס עצמו וכד')



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



בתור ניסוי, ננסה מהמחשב המרוחק, ליצור תיקייה בשם LeiderTech על מחשב client1, כמו כל דבר ב PowerShell גם כאן המבנה של הפקודה מאוד מאוד פשוט ולפי הגיון - אנחנו רוצים ליצור תיקייה בכונן :C בשם LeiderTech:
:new-item -name LeiderTech -type directory -path c


רגע של חזרה על המאמר הראשון בסדרה לגבי "עזרה": בשביל להציג עזרה ורק דוגמאות נריץ את פקודת העזרה בצורה הזאת:
help new-item -examples

והמערכת מראה לי איך אני אמור לכתוב את הפקודה בשביל ליצור תיקייה (ההפך הגמור ממה שאני רשמתי למעלה ובלי גרשיים בכלל - זה כל היופי במערכת הזאת, הגמישות):
"New-Item -Path "c:\" -Name "logfiles" -ItemType "directory

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

והינה התוצאה:

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


בתצלום התחתון אנחנו יכולים לראות שנוצרה תיקייה בשם LeiderTech.

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


כמו תמיד, להלן מדריך מצולם:





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

לכלל המדריכים אודות PowerShell הכנסו ללינק הזה: כלל המדריכים




10 תגובות:

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

תודה :)