IPアドレスを取得するためのPowerShellの使用方法

IT管理者はPowerShellとコマンドラインを使用して多くのことができます。Windowsネットワーキングとの作業もその一つです。このチュートリアルでは、Get-NetIPAddressコマンドレットとWMIを使用して、WindowsコンピュータのネットワークアダプタからIPアドレスを取得する方法を学びます。

前提条件

このチュートリアルでは、Windows 10以降のコンピュータでWindows PowerShell v5.1がインストールされていると想定しています。また、Active Directory環境にいると想定しています。そうでない場合は、New-CimSessionコマンドレットのCredentialプロパティについて学ぶことをお勧めします。

Get-NetIPAddressの使用方法

PowerShellには、ネットワーク接続を操作するためのさまざまなコマンドレットがあります。例えば、Get-NetAdapterGet-NetAdapterBinding、そして特定のIPアドレスを検索するためのGet-NetIPAddressなどがあります。シンプルなスクリプトでPowerShellを使用してIPアドレスを取得したい場合は、これらのコマンドレットを使用してください。

シンプルに保ちましょう。PowerShellがより簡単な方法を提供している場合は、それを使いましょう。

例えば、ローカルコンピュータのすべてのネットワークアダプタでIPv4アドレスを検索するには、1行のコマンドを実行します。

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については、The Ipconfig Commands You Need to Knowを参照してください。

CIM/WMIを使用する理由は何ですか?

Get-NetIPAddressコマンドレットを実行すると、PowerShellは実際にはWMIにクエリを送信してその情報を取得します。これを知っておくことが重要な理由は何でしょうか?なぜなら、直接WMIにクエリを送信することができるからです。ただし、単一のコマンドを使用できる場合にWMIを使用する理由は何でしょうか?

Get-NetIPAddressのような単一のコマンドを使用する代わりにWMIを使用する最も一般的な理由の1つは、既にWMIにクエリを送信している場合です。WMIには、在庫管理のためのスクリプトを作成する際に便利なシステム情報がたくさん含まれています。

PowerShellでWMIと通信する際には、PSRemotingセッションのようなCIMセッションを作成することができます。セッションを使用すると、コンピュータへの認証を一度行い、その接続を繰り返し利用する効率的な方法です。

このタスクを大規模なスクリプトの一部として作成する場合、IPアドレスを取得するためにCIMを使用します。

セッションなしでCIMをクエリする

さまざまな情報をクエリするためにCIMを使用してPowerShellスクリプトを作成する場合は、再利用可能なCIMセッションを使用する必要があります。単一のセッションを再利用することは、スクリプトの実行速度を向上させるだけでなく、コードの重複を減らす効果もあります。

たとえば、リモートのWindowsコンピューターが実行しているオペレーティングシステムを調べたい場合、CIMはWin32_OperatingSystemクラスのCaptionプロパティにOSの名前を保持しています。この情報を取得するためには、下記の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に4回接続します。また、コンピューター名が変更された場合は、そのコンピューター名を見つけて置換する必要があります。これはコーディング中に良い兆候ではありません。

CIMセッションの作成

Get-CimInstanceをセッションと共に使用する代わりに、New-CimSessionコマンドレットを使用して単一の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アドレスのないネットワークアダプタや1つのIPアドレスを持つもの、複数のIPアドレスを持つものがあることに気付くでしょう!それを絞り込む必要があります。すべてのサーバーに適用できる基準を見つける必要があります。

Lots of output from The Win32_NetworkAdapterConfiguration class!

各アダプターには、IPEnabledプロパティが表示されます。このプロパティがTrueに設定されている場合、TCP/IPプロトコルがこのNICにバインドされており、IPアドレスを持つための前提条件となります。IPEnabledプロパティがTrueに設定されているNICに絞り込む必要があり、そのようなアダプターが見つかります。

WMIインスタンスをフィルタリングする場合、Get-CimInstanceFilterパラメータを使用することが最善です。PowerShellコミュニティには、「左側にフィルタリングする」というモットーがあります。この言葉の意味は、できるだけ左側に出力をフィルタリングするということです。

必要な場合を除いて、Where-Objectは使用しないでください。パイプラインを通過する不要なオブジェクトの処理のオーバーヘッドがないため、パフォーマンスが向上します。

Get-CimInstanceFilterパラメータは、Windows Query Language (WQL)を使用します。WQLはSQLの小さなサブセットです。Filterパラメータは、SQLと同じ制約のWHERE句の構文を期待します。

SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'というWQLクエリを使用して、IPEnabledプロパティがTrueに設定されているWin32_NetworkAdapterConfigurationクラスのすべてのCIMインスタンスを検索します。

Get-CimInstanceClassNameパラメータ引数のクラス名を指定しているため、FilterではIPEnabled = 'True'を指定する必要があります。これにより、IPアドレスを持つネットワークアダプタのみが返されます。

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

上記のコードスニペットを実行すると、Get-CimInstanceが単一の(または限られた数の)インスタンスのみを返すことがわかります。

単一のCIMインスタンスがあり、探しているプロパティ(IPAddress)を知っているので、どのようなものか見てみましょう。以下のように、このインスタンスでは、IPAddressプロパティには3つの文字列が含まれており、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の設定はアダプタやさまざまな設定で大きく異なる場合があります。フィルタリングする際には創造的になる必要があります。

結論

コンピュータからIPアドレスを取得するには、まずGet-NetIPAddressコマンドレットを確認してください。このコマンドを実行できない場合、またはより大きなスクリプトを作成する場合は、Get-CimInstanceとCIMセッションを使用して作業を行うことも検討してください。

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