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-NetAdapter
、Get-NetAdapterBinding
,甚至還有一個專門用於尋找 IP 地址的命令,稱為 Get-NetIPAddress
。如果您想要使用 PowerShell 在簡單的腳本中獲取 IP 地址,請務必使用這些 cmdlet。
保持簡單。如果 PowerShell 提供了更簡單的方法來完成某事,就使用它吧!
例如,要在本機電腦上找到所有網路適配器的 IPv4 地址,只需執行一行命令。

上面的輸出引用了特定的網路適配器,如乙太網路適配器,並且僅返回 IP 地址。

你完成了!僅使用 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
時,PowerShell 必須找到遠端電腦,將登錄憑證傳遞給它,然後 最終 查詢 CIM 以獲取所需的信息。在不使用會話的情況下運行 Get-CimInstance
會帶來很多開銷。
如果你正在構建一個服務器庫存腳本,並且還想查找有關存儲、內存、網絡等信息,那麼你會有很多像下面這樣的 Get-CimInstance
命令。
在上面的代碼片段中,你的腳本將連接到 REMOTECOMPUTER
四次,如果計算機名稱更改怎麼辦?你將不得不找到/替換該計算機名稱,這在編碼時永遠不是一個好的跡象。
創建 CIM 會話
與使用會話的 Get-CimInstance
不同,你應該使用 New-CimSession
cmdlet 創建一個單獨的 CIM 會話,然後 重複使用 這個會話。
不要一次又一次地對遠程計算機進行身份驗證,使用New-CimSession
創建一個單獨的CIM會話,並將該會話傳遞給Get-CimInstance
,如下所示。
完成會話後,斷開並從內存中刪除它。
像上面這樣使用CIM會話是一種很好的處理CIM/WMI的方法。
查找正確的網絡適配器
由於Windows計算機可以擁有不同的網絡適配器,因此您首先必須縮小範圍,確定要從哪個網絡適配器獲取IP地址。在使用WMI時,使用Win32_NetworkAdapterConfiguration類。該類提供了大部分由Get-NetIPAddress
返回的信息。
首先,使用遠程計算機的名稱創建一個PowerShell腳本,然後創建一個新的CIM會話,然後在下面添加CIM會話刪除行。
構建CIM會話代碼後,插入WMI查詢。

您可以看到上面的默認輸出不顯示IP地址。您需要更深入地研究一下。它還不返回單個實例。如何縮小到具有所需IP地址的適配器?
為了做到這一點,首先使用Select-Object
顯示所有屬性。
滾動輸出,您會注意到一些沒有IP地址的網絡適配器,一些具有一個IP地址,一些具有多個IP地址!您必須將其限制下來。您必須找到一些標準標準來進行過濾,以便可以應用於所有服務器。

在每個適配器上,您應該看到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
僅返回一個(或有限的一組)實例。
現在您已經有了單個CIM實例並且知道您要查找的屬性(IPAddress
),讓我們看看它是什麼樣子。您將看到,在此實例中,它返回一個單個的CIM實例,但對於IPAddress
屬性,它包含三個字符串,包括IPV6地址。
您需要進一步過濾一些元素。因為WQL無法深入過濾IPAddress
屬性值以下的內容,所以您現在必須解析出IPv4地址。
IPv4地址通常是數組中定義的第一個地址。如下所示通過引用索引0來選擇它。當您這樣做時,您將看到它僅返回一個單個的IPv4 IP地址字符串。
IPv4地址可能並不總是數組的第一個元素。事實上,IPAddress屬性甚至可能不是一個數組。各種適配器和各種配置之間的IP配置差異很大。您可能需要在過濾它們時發揮創意。
結論
如果您需要使用 PowerShell 從電腦獲取 IP 地址,首先查看 Get-NetIPAddress
cmdlet。如果您正在構建一個較大的腳本或由於某些原因無法運行此命令,請考慮使用 Get-CimInstance
和 CIM 會話來完成骯髒的工作。
Source:
https://adamtheautomator.com/powershell-get-ip-address/