ניהול של מערכות מרוחקות יכול במהירות להפוך לכאב ראש, במיוחד כאשר מריצים פקודות מרובות על פני מכונות שונות. החזרת הקשרים המתמדת למערכות יכולה לבזבז זמן ולהאט את זרימת העבודה שלך. נשמע מוכר? אל תדאג, יש דרך טובה יותר!
במדריך זה, תלמד להשתמש במושבים חוזרים של PowerShell כדי להפוך את ניהול המערכות המרוחקות למהיר, קל ויעיל יותר.
מוכן לשדרג את כישורי הרימוט של PowerShell שלך? בוא נצלול פנימה!
יצירה ושימוש במושב
כאשר עובדים עם מערכות מרוחקות, אחת מהמשימות המתישות ביותר יכולה להיות ההתחברות אליהן בכל פעם שאתה מריץ פקודה. במקרים כאלה, מושבים חוזרים נכנסים לפעולה.
יצירת מושב מתמשך שומרת על חיבור רציף. כך אין צורך להתחבר ולנתק כשאתה מבצע מספר פקודות שוב ושוב.
כדי להתחיל, תצטרך ליצור מושב חוזר.
הפקודה New-PSSession
מקימה חיבור מתמשך למחשב המרוחק:
$session = New-PSSession -ComputerName SRV2
אובייקט המושב הזה יכול להיות מועבר לפקודות כמו Invoke-Command
, ומאפשר לך להשתמש באותו מושב לאורך כל הסקריפט שלך.
למשל, אתה יכול לבדוק את החיבור על ידי הרצת פקודה בסיסית:
Invoke-Command -Session $session -ScriptBlock { hostname }
מושב חוזר גם מאפשר לך לאחסן ולהשיג משתנים על המערכת המרוחקת:
Invoke-Command -Session $session -ScriptBlock { $foo = 'Please be here next time' } Invoke-Command -Session $session -ScriptBlock { $foo }
יכולת האחסון המתמשכת הזו היא יתרון משמעותי של מושבים חוזרים, המאפשרת לך לשמור על מצב לאורך מספר פקודות.
התאמת הפונקציה לשימוש מרוחק
נעדכן את פונקציית המלאי כך שתעבוד עם מושבים שניתן להשתמש בהם מחדש.
ראשית, נוסיף פרמטר Session
כדי לקבל אובייקט מושב, כאשר הפקודה Get-Member
עוזרת לזהות את סוג אובייקט המושב:
$session | Get-Member
לאחר זיהוי שאובייקט המושב הוא מסוג System.Management.Automation.Runspaces.PSSession
, הצעד הבא הוא להגדיר את פונקציית Get-WmiObjectValue
.
פונקציה זו משתמשת בפרמטר המושב כדי לאפשר ביצוע מרחוק, מה שמאפשר לה להריץ בלוק סקריפט על המערכת המרוחקת ולמשוך מאפיין WMI ספציפי.
function Get-WmiObjectValue { [CmdletBinding()] param( # Specify the name of the WMI property to query [Parameter(Mandatory)] [string]$PropertyName, # Specify the name of the WMI class to query [Parameter(Mandatory)] [string]$WmiClassName, # Specify the remote session object to use for invoking the command [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) # Define the script block to execute on the remote machine $scriptBlock = { # Get the sum of the specified property from the WMI class $number = (Get-CimInstance -ClassName $using:WmiClassName | Measure-Object -Property $using:PropertyName -Sum).Sum # Convert the sum to gigabytes $numberGb = $number / 1GB # Round the result to 2 decimal places [math]::Round($numberGb, 2) } # Execute the script block on the remote machine using the provided session Invoke-Command -Session $Session -Scriptblock $scriptBlock }
בואו ננסה את הפונקציה הזו ונראה מה קורה.
Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session
אתם עשויים להיתקל בשגיאה הזו בשלב כלשהו. אבל אל דאגה. המשיכו לקרוא, ותלמדו כיצד להתמודד עם השגיאה הזו.
טיפול בבעיות אימות
אם תיתקלו בשגיאות "גישה נדחתה", סביר להניח שזה נובע מהרשאות לא מספיקות. כברירת מחדל, מושבים שניתן להשתמש בהם מחדש יורשים את האישורים ששימשו ליצירתם.
בדקו את שם המשתמש של המשתמש המאומת הנוכחי במערכת:
whoami
אם למשתמש הדומיין, שנקרא user, אין הרשאה לשאול WMI על המחשב המרוחק, העלו את Invoke-Command
כדי להשתמש בחשבון מנהל.
ראשית, צרו אובייקט אישורים עם הפקודה Get-Credential
כדי לציין אישורים חלופיים בעת יצירת המושב:
$adminCred = Get-Credential -UserName adam
לאחר שהאימות הצליח, בדקו את המושב:
Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred
בדיקה זו מבטיחה שהמושב פועל כפי שצפוי לפני הרצת פונקציית המלאי שלכם.
אם הסשן לא עבד, זה כבר נוצר עם פרטי כניסה שגויים. אם זה המקרה, עליך להסיר את הסשן הנוכחי:
Remove-PSSession -Session $session
הפקודה Remove-PSSession
מסירה את הסשן בשני המחשבים – המקומי והמרוחק.
כאשר הסשן הישן נמחק, צור סשן חדש. אך הפעם, צור את הסשן עם אימות כמשתמש המנהל:
$session = New-PSSession -ComputerName SRV2 -Credential $adminCred
נסה שוב את הפקודה Invoke-Command
באמצעות הסשן החדש וראה מה קורה.
Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred
עכשיו שאתה בטוח שהסשן החדש עובד, נסה שוב את הפונקציה.
Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session
איחד הכל יחד
העבודה הקשה נעשתה, והגיע הזמן לשלב הכל בתוך סקריפט אחד.
הסקריפט הסופי מצביע מידע על המלאי, מציג את התוצאות ומנקה את הסשן:
function Get-WmiObjectValue { [CmdletBinding()] param( # Specify the name of the WMI property to query [Parameter(Mandatory)] [string]$PropertyName, # Specify the name of the WMI class to query [Parameter(Mandatory)] [string]$WmiClassName, # Specify the remote session object to use for invoking the command [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) # Define the script block to execute on the remote machine $scriptBlock = { # Get the sum of the specified property from the WMI class $number = (Get-CimInstance -ClassName $using:WmiClassName | Measure-Object -Property $using:PropertyName -Sum).Sum # Convert the sum to gigabytes $numberGb = $number / 1GB # Round the result to 2 decimal places [math]::Round($numberGb, 2) } # Execute the script block on the remote machine using the provided session Invoke-Command -Session $Session -Scriptblock $scriptBlock } ## Grab the alternate credential: Get-CimInstance will work on the remote computer $adminCred = Get-Credential -UserName adam ## Create a session authenticating as the adam (admin) user $session = New-PSSession -ComputerName SRV2 -Credential $adminCred ## Find the total memory and total volume storage space on the remote computer $totalMemoryGb = Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session $totalStorageGb = Get-WmiObjectValue -PropertyName FreeSpace -WmiClassName Win32_LogicalDisk -Session $session Write-Host "The computer $($session.ComputerName) has $totalMemoryGb GB of memory and $totalStorageGb GB of free space across all volumes." ## Remove the shared session Remove-PSSession -Session $session
שמור והריץ את הסקריפט (Get-InventoryInfo.ps1) כדי לוודא שהוא עובד כפי שצוין.
מסקנה
במדריך זה, למדת לבנות פונקציה חזקה המשתמשת בסשנות חוזרות לניהול מחשבים מרוחקים בצורה יעילה. עכשיו אתה יודע כיצד לשמור על חיבור עמיד במהלך פעולות מורכבות על מערכות רחוקות בלעדי התנתקות בכל פעם.
לעבור קדימה, תוכל לבנות על הידע הזה על ידי כלול סשנות חוזרות בתהליכי אוטומציה גדולים יותר. דוגמה אחת תהיה להרחיב את פונקציית המלאי כדי לאסוף מדדי מערכת נוספים או לאוטומציה של משימות תחזוקה על מספר מחשבים רחוקים.
שלב את הפגישות החוזרות עם תכונות PowerShell אחרות. סנכרן את ניהול ה-IT ומאמצי האוטומציה שלך כדי לחסוך זמן ולהפחית ערעורים ידניים.
Source:
https://adamtheautomator.com/powershell-reusable-sessions/