איך להשתמש ב-PowerShell כדי לקבל כתובת IP

מנהלי ה-IT יכולים לעשות הרבה דברים עם PowerShell ועם שורת הפקודה; העבודה עם רשתות Windows היא אחת מהדרכים לעשות זאת. במדריך זה, אתה הולך ללמוד איך להשתמש ב-PowerShell כדי לקבל כתובות IP ממתאמי רשת במחשב Windows באמצעות פקודת ה-Get-NetIPAddress ו-WMI.

דרישות מוקדמות

המדריך יניח שאתה על מחשב עם Windows 10 או גרסה גבוהה יותר ועם PowerShell של Windows v5.1 מותקן. מניחים גם שאתה בסביבת Active Directory. אם לא, הקפד ללמוד על המאפיין Credential בפקודת New-CimSession.

שימוש ב-Get-NetIPAddress

פוורשל כוללת מספר פקודות cmdlets שניתן להשתמש בהן לעבוד עם חיבורי רשת, כמו לדוגמה Get-NetAdapter, Get-NetAdapterBinding, ואפילו פקודה אחת במיוחד למציאת כתובות IP הנקראת Get-NetIPAddress. אם ברצונך להשתמש בפוורשל כדי לקבל את כתובת ה-IP בסקריפט פשוט, אתה יכול להשתמש בפקודות אלו.

השתמש בפתרון הפשוט ביותר. אם PowerShell מציעה דרך פשוטה יותר לעשות משהו, עשה את זה!

לדוגמה, כדי למצוא את כתובת ה-IPv4 בכל מתאם רשת על מחשב מקומי, תריץ שורת פקודה אחת.

Get-NetIPAddress -AddressFamily IPV4
Finding IPV4 addresses with Get-NetIPAddress

הפלט מעלה מתייחס למתאם רשת ספציפי כמו המתאם Ethernet ומחזיר רק את כתובת ה-IP.

Getting the IP address from a specific adapter

סיימת! השימוש בפוורשל כדי לקבל כתובת IP הוא תהליך ישיר, לפחות הרבה יותר משימוש באמצעים אחרים.

אם אתה לא אוהב את פוורשל, תוכל גם להשתמש בפקודת ipconfig כדי לקבל כתובת IP. ניתן למצוא מידע נוסף על ipconfig ב- הפקודות Ipconfig שעליך לדעת.

למה להשתמש ב-CIM/WMI?

כאשר אתה מפעיל את פקודת ה-Get-NetIPAddress, PowerShell בעצם מתאים שאילתה ל-WMI כדי לקבל את המידע הזה. למה זה חשוב לדעת זאת? מכיוון שאתה יכול לשאול את WMI ישירות בעצמך. אך למה להשתמש ב-WMI כשניתן להשתמש בפקודה יחידה?

אחת הסיבות הנפוצות ביותר להשתמש ב-WMI מעל פקודה יחידה כמו Get-NetIPAddress היא כאשר כבר משאילים WMI. WMI מכילה המון מידע מערכתי שימושי בעת בניית סקריפטים לצורכי מלאי.

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

השתמש ב-CIM כדי לקבל כתובת IP כאשר אתה בונה את המשימה הזו כחלק מסקריפט גדול יותר.

שאילתת CIM בלי הפעלה

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

שאולי תרצה למצוא איזה מערכת הפעלה פועלת על מחשב Windows רחוק. CIM מחזיקה את שם המערכת הפעלה בתוך מאפיין הנקרא Caption בתוך מחלקת Win32_OperatingSystem. כדי לקבל את המידע הזה, יש להשתמש ב־Get-CimInstance המצוין למטה, ולציין את שם המחשב (REMOTECOMPUTER), את מחלקת CIM (Win32_OperatingSystem), ולהתייחס רק למאפיין Caption באובייקט.

(Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_OperatingSystem).Caption

כאשר אתה מפעיל את Get-CimInstance, PowerShell צריך למצוא את המחשב הרחוק, להעביר אליו את פרטי הכניסה של המשתמש, ולבסוף לשאול את CIM למידע שאתה צריך. יש הרבה עומס שמגיע עם הפעלת Get-CimInstance בלעדיו של ישיבה.

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

Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_LogicalDisk
Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_OperatingSystem
Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_PhysicalMemory
Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_NetworkAdapter

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

יצירת ישיבת CIM

במקום להשתמש ב־Get-CimInstance עם ישיבה, אתה יכול ליצור ישיבת CIM יחידה עם ה־New-CimSession cmdlet ולשקול להשתמש בישיבה זו שוב ושוב.

במקום לאמת מחדש אל מחשב מרוחק פעמים רבות, צור משימה CIM יחידה עם New-CimSession והעבר את המשימה הזו ל- Get-CimInstance כמו שמתואר למטה.

$remoteComputer = 'REMOTECOMPUTER'
$cimSession = New-CimSession -ComputerName $remoteComputer

Get-CimInstance -CimSession $cimSession -ClassName Win32_LogicalDisk
Get-CimInstance -CimSession $cimSession -ClassName Win32_OperatingSystem
Get-CimInstance -CimSession $cimSession -ClassName Win32_PhysicalMemory
Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapter

כאשר תסיים עם המשימה, התנתק והסר אותה מהזיכרון.

$cimSession | Remove-CimSession

שימוש במשימות CIM כפי שתואר מעלה הוא דרך מצוינת לעבוד עם CIM/WMI.

מציאת מתאם רשת הנכון

מאחר ומחשב Windows יכול להכיל מתאמי רשת שונים, עליך תחילה להגביל לאיזה מתאם רשת אתה רוצה לקבל את כתובת ה-IP ממנו. כאשר אתה משתמש ב-WMI, השתמש במחלקת Win32_NetworkAdapterConfiguration. מחלקה זו מספקת הרבה מהמידע שמכילה הפקודה Get-NetIPAddress.

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

$remoteComputer = 'REMOTECOMPUTER'
$cimSession = New-CimSession -ComputerName $remoteComputer

$cimSession | Remove-CimSession

כאשר תבנה את קוד המשימה CIM, הכנס את שאילתת ה-WMI.

$remoteComputer = 'REMOTECOMPUTER'
$cimSession = New-CimSession -ComputerName $remoteComputer

Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration

$cimSession | Remove-CimSession
Querying WMI with a CIM session to get network adapter information

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

על מנת לעשות זאת, תציג תחילה את כל המאפיינים באמצעות Select-Object.

Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration | Select-Object -Property *

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

Lots of output from The Win32_NetworkAdapterConfiguration class!

על כל מתאם, אתה צריך לראות את המאפיין IPEnabled. כאשר המאפיין הזה מוגדר ל-True, הפרוטוקול TCP/IP מחובר ל-NIC הזה, שהוא דרישה מראשית לקבלת כתובת IP. עליך להקטין את ה-NICs שיש להם את המאפיין IPEnabled מוגדר ל-True, ותקבל את המתאם שחיפשת.

כאשר אתה מסנן מופעים של WMI, כדאי להשתמש בפרמטר Filter ב-Get-CimInstance. יש חריצה בקהילת PowerShell שאומרת "סנן שמאלה". אם יש לך הזדמנות, המשמעות של המקרא הזה היא לסנן את הפלט תמיד כמה שיותר שמאלה.

אל תשתמש ב-Where-Object אלא אם חייב. הביצועים יהיו הרבה יותר מהירים במקום זה בשל החוסר בהוצאות נוספות של עיבוד אובייקטים לא נדרשים בצינור.

הפרמטר Filter ב-Get-CimInstance משתמש ב-שפת שאילתות Windows (WQL). WQL היא תת-קבוצה קטנה של SQL. הפרמטר Filter מצפה לתחביר של אותם אילון WHERE כמו ש-SQL היה מצפה.

כדי למצוא את כל המופעים CIM של מחלקת Win32_NetworkAdapterConfiguration עם המאפיין IPEnabled מוגדר ל-True, עליך להשתמש בשאילתת WQL SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'.

מכיוון שאנו כבר מציינים את שם המחלקה עבור פרמטר הארגומנט ClassName ב־Get-CimInstance, אנו צריכים לציין IPEnabled = 'True' עבור ה־Filter. זה יחזיר רק את מתאם הרשת עם כתובת IP.

Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'" | Select-Object -Property *

כאשר אתה מפעיל את קטע הקוד למעלה, אתה צובע לראות ש־Get-CimInstance מחזיר רק יחיד (או סט מוגבל) של מופעים.

עכשיו שיש לך מופע CIM יחיד ואתה יודע את המאפיין שאתה מחפש (IPAddress), בוא נראה איך זה נראה. תראה למטה שבמקרה זה, זה מחזיר מופע CIM יחיד אך עם שלוש מחרוזות עבור מאפיין IPAddress, כולל כתובות IPV6.

(Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'").IPAddress

192.168.0.40
fe80::e4e1:c511:e38b:4f05
2607:fcc8:acd9:1f00:e4e1:c511:e38b:4f05

עליך לסנן עוד אלמנטים מחוץ לכך. מכיוון ש־WQL אינו יכול לסנן עמוק יותר מערך הערכים של מאפיין IPAddress, עליך כעת לאתר את כתובת ה־IPv4.

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

(Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'").IPAddress[0]

192.168.0.40

כתובת ה־IPV4 לא תמיד תהיה אלמנט המערך הראשון. למעשה, מאפיין ה־IPAddress עשוי לא להיות אפילו מערך. הגדרות ה־IP ישתנו בצורה דרסטית במתאמים ובהגדרות שונות. עשוי להיות עליך להפעיל יצירתיות בסינון שלהם.

סיכום

אם יש לך צורך לקבל כתובת IP ממחשב באמצעות PowerShell, ראה את הפקודה Get-NetIPAddress תחילה. אם אתה בונה סקריפט גדול יותר או אינך יכול להפעיל את הפקודה הזו מסיבה מסוימת, נסה להשתמש ב- Get-CimInstance וב-CIM session כדי לבצע את העבודה הקשה.

Source:
https://adamtheautomator.com/powershell-get-ip-address/