如何使用 PowerShell 獲取 IP 地址

IT 管理員可以使用 PowerShell 和命令行執行許多操作;處理 Windows 網路是其中之一。在本教程中,您將學習如何使用 PowerShell 和 Get-NetIPAddress 命令以及 WMI 從 Windows 電腦的網路介面卡獲取 IP 地址。

先決條件

本教程將假設您正在運行 Windows 10 或更新版本的電腦上,並安裝了 Windows PowerShell v5.1。同時也假設您處於 Active Directory 環境中。如果不是,請確保了解 New-CimSession 命令中的 Credential 屬性。

使用 Get-NetIPAddress

PowerShell 具有各種 cmdlet 來處理網路連線,例如 Get-NetAdapterGet-NetAdapterBinding,甚至還有一個專門用於尋找 IP 地址的命令,稱為 Get-NetIPAddress。如果您想要使用 PowerShell 在簡單的腳本中獲取 IP 地址,請務必使用這些 cmdlet。

保持簡單。如果 PowerShell 提供了更簡單的方法來完成某事,就使用它吧!

例如,要在本機電腦上找到所有網路適配器的 IPv4 地址,只需執行一行命令。

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

上面的輸出引用了特定的網路適配器,如乙太網路適配器,並且僅返回 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包含了在構建用於庫存目的的腳本時非常有用的許多系統信息。

在使用PowerShell與WMI通信時,你可以創建一個類似於PSRemoting會話的CIM會話。使用會話是一種高效的方法,可以在一次驗證計算機後重複使用該連接。

當你在構建這個任務的一部分的腳本時,使用CIM來獲取IP地址。

在沒有會話的情況下查詢CIM

當你正在使用CIM來查詢各種信息構建PowerShell腳本時,應該使用可重複使用的CIM會話。重複使用一個會話不僅可以加快腳本的執行速度,還可以減少代碼重複。

舉例來說,也許你想找出遠端 Windows 電腦正在運行的作業系統。CIM 在 Win32_OperatingSystem 類別中將作業系統名稱存儲在稱為 Caption 的屬性中。要獲取此信息,你可以使用以下 Get-CimInstance cmdlet,指定電腦名稱 (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 不同,你應該使用 New-CimSession cmdlet 創建一個單獨的 CIM 會話,然後 重複使用 這個會話。

不要一次又一次地對遠程計算機進行身份驗證,使用New-CimSession創建一個單獨的CIM會話,並將該會話傳遞給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地址的先決條件。您必須縮小具有IPEnabled屬性設置為True的NIC範圍,然後您將找到所需的適配器。

在篩選WMI實例時,最好使用Get-CimInstance上的Filter參數。PowerShell社區有一句口號是“往左過濾”。如果有機會,這句話意味著始終將輸出過濾到盡可能靠左的位置。

除非必須,否則不要使用Where-Object。這樣做的性能會更快,因為減少了在管道上處理不必要對象的開銷。

Get-CimInstance上的Filter參數使用Windows查詢語言(WQL)。WQL是SQL的一個小子集。Filter參數期望與SQL相同的約束WHERE子句語法。

要查找所有Win32_NetworkAdapterConfiguration類的CIM實例,其中IPEnabled屬性設置為True,請使用SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True' WQL查詢。

由於我們已經在Get-CimInstance中為ClassName參數指定了類名,所以我們需要在Filter中指定IPEnabled = 'True'。這將只返回具有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來選擇它。當您這樣做時,您將看到它僅返回一個單個的IPv4 IP地址字符串。

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

192.168.0.40

IPv4地址可能並不總是數組的第一個元素。事實上,IPAddress屬性甚至可能不是一個數組。各種適配器和各種配置之間的IP配置差異很大。您可能需要在過濾它們時發揮創意。

結論

如果您需要使用 PowerShell 從電腦獲取 IP 地址,首先查看 Get-NetIPAddress cmdlet。如果您正在構建一個較大的腳本或由於某些原因無法運行此命令,請考慮使用 Get-CimInstance 和 CIM 會話來完成骯髒的工作。

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