كيفية استخدام PowerShell للحصول على عنوان IP

يمكن لمسؤولي تكنولوجيا المعلومات القيام بالكثير باستخدام PowerShell وسطر الأوامر. العمل مع شبكات Windows هو واحد من تلك الطرق. في هذا البرنامج التعليمي ، ستتعلم كيفية استخدام PowerShell للحصول على عناوين IP من محولات الشبكة على جهاز كمبيوتر Windows باستخدام الأمر Get-NetIPAddress وWMI.

المتطلبات المسبقة

سوف يفترض هذا البرنامج التعليمي أنك تستخدم كمبيوترًا يعمل بنظام Windows 10 أو أحدث مع تثبيت Windows PowerShell v5.1. كما يُفترض أنك تعمل في بيئة Active Directory. إذا لم يكن الأمر كذلك ، تأكد من التعرف على خاصية Credential على أمر New-CimSession.

استخدام Get-NetIPAddress

تحتوي PowerShell على مجموعة متنوعة من الأوامر للعمل مع اتصالات الشبكة مثل Get-NetAdapter و Get-NetAdapterBinding ، وحتى واحدة مصممة خصيصًا للعثور على عناوين IP تسمى Get-NetIPAddress. إذا كنت ترغب في استخدام PowerShell للحصول على عنوان IP في سكريبت بسيط، فيمكنك استخدام هذه الأوامر.

البساطة هي الأفضل. إذا كان بإمكان PowerShell أن يقدم طريقة أسهل للقيام بشيء ما، فافعلها!

على سبيل المثال، للعثور على عنوان IPv4 على جميع محولات الشبكة على جهاز الكمبيوتر المحلي، قم بتشغيل سطر واحد.

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

يشير الإخراج أعلاه إلى محول شبكة محدد مثل محول Ethernet ويعيد فقط عنوان IP.

Getting the IP address from a specific adapter

انتهيت! استخدام PowerShell للحصول على عنوان IP هو عملية مباشرة، على الأقل أكثر بساطة من استخدام وسائل أخرى.

إذا لم تكن من محبي PowerShell، يمكنك أيضًا استخدام أمر 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 قابلة لإعادة الاستخدام. إعادة استخدام جلسة واحدة لا يسرع فقط النص الخاص بك ، بل يقلل أيضًا من تكرار الشفرة.

على سبيل المثال، ربما ترغب في معرفة نظام التشغيل الذي يعمل عليه جهاز كمبيوتر ويندوز عن بُعد. يحتوي 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” واستخدام تلك الجلسة مرارًا وتكرارًا.

بدلاً من المصادقة على جهاز كمبيوتر عن بُعد مرارًا وتكرارًا ، قم بإنشاء جلسة 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! يجب عليك تقييدها. يجب أن تجد بعض المعايير القياسية لتصفية ذلك حتى يمكن تطبيقه على جميع الخوادم.

Lots of output from The Win32_NetworkAdapterConfiguration class!

على كل محول، يجب أن ترى خاصية IPEnabled. عندما يتم تعيين هذه الخاصية إلى True، فإن بروتوكول TCP/IP مرتبط بمحول NIC هذا، وهو شرط أساسي للحصول على عنوان IP. يجب عليك تحديد محولات NIC التي تحتوي على خاصية 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 بشكل كبير عبر المحولات والتكوينات المختلفة. قد تحتاج إلى أن تكون مبدعًا في تصفيتها.

الاستنتاج.

إذا كنت بحاجة إلى استخدام PowerShell للحصول على عنوان IP من جهاز كمبيوتر، فابدأ بالنظر في الأمر Get-NetIPAddress. إذا كنت تقوم ببناء نص أكبر أو لا يمكنك تشغيل هذا الأمر لسبب ما، فتحقق من استخدام Get-CimInstance وجلسة CIM للقيام بالعمل الشاق.

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