IT管理者はPowerShellとコマンドラインを使用して多くのことができます。Windowsネットワーキングとの作業もその一つです。このチュートリアルでは、Get-NetIPAddress
コマンドレットとWMIを使用して、WindowsコンピュータのネットワークアダプタからIPアドレスを取得する方法を学びます。
前提条件
このチュートリアルでは、Windows 10以降のコンピュータでWindows PowerShell v5.1がインストールされていると想定しています。また、Active Directory環境にいると想定しています。そうでない場合は、New-CimSession
コマンドレットのCredential
プロパティについて学ぶことをお勧めします。
Get-NetIPAddress
の使用方法
PowerShellには、ネットワーク接続を操作するためのさまざまなコマンドレットがあります。例えば、Get-NetAdapter
、Get-NetAdapterBinding
、そして特定のIPアドレスを検索するためのGet-NetIPAddress
などがあります。シンプルなスクリプトでPowerShellを使用してIPアドレスを取得したい場合は、これらのコマンドレットを使用してください。
シンプルに保ちましょう。PowerShellがより簡単な方法を提供している場合は、それを使いましょう。
例えば、ローカルコンピュータのすべてのネットワークアダプタでIPv4アドレスを検索するには、1行のコマンドを実行します。

上記の出力は、イーサネットアダプタなど特定のネットワークアダプタを参照し、IPアドレスのみを返します。

以上です!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
を実行すると、PowerShellはリモートコンピューターを見つけ、ログイン済みの資格情報を渡し、必要な情報を取得するためにCIMにクエリを実行します。Get-CimInstanceをセッションなしで実行する場合、多くのオーバーヘッドが発生します。
もしもサーバーのインベントリスクリプトを作成し、ストレージ、メモリ、ネットワーキングなどの情報も取得したい場合、以下のようにGet-CimInstance
コマンドがたくさん含まれることになります。
上記のコードスニペットでは、スクリプトはREMOTECOMPUTER
に4回接続します。また、コンピューター名が変更された場合は、そのコンピューター名を見つけて置換する必要があります。これはコーディング中に良い兆候ではありません。
CIMセッションの作成
Get-CimInstance
をセッションと共に使用する代わりに、New-CimSession
コマンドレットを使用して単一の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アドレスのないネットワークアダプタや1つのIPアドレスを持つもの、複数のIPアドレスを持つものがあることに気付くでしょう!それを絞り込む必要があります。すべてのサーバーに適用できる基準を見つける必要があります。

各アダプターには、IPEnabled
プロパティが表示されます。このプロパティがTrueに設定されている場合、TCP/IPプロトコルがこのNICにバインドされており、IPアドレスを持つための前提条件となります。IPEnabled
プロパティがTrueに設定されているNICに絞り込む必要があり、そのようなアダプターが見つかります。
WMIインスタンスをフィルタリングする場合、Get-CimInstance
のFilter
パラメータを使用することが最善です。PowerShellコミュニティには、「左側にフィルタリングする」というモットーがあります。この言葉の意味は、できるだけ左側に出力をフィルタリングするということです。
必要な場合を除いて、Where-Object
は使用しないでください。パイプラインを通過する不要なオブジェクトの処理のオーバーヘッドがないため、パフォーマンスが向上します。
Get-CimInstance
のFilter
パラメータは、Windows Query Language (WQL)を使用します。WQLはSQLの小さなサブセットです。Filter
パラメータは、SQLと同じ制約のWHERE句の構文を期待します。
SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'
というWQLクエリを使用して、IPEnabledプロパティがTrueに設定されているWin32_NetworkAdapterConfigurationクラスのすべてのCIMインスタンスを検索します。
Get-CimInstance
でClassName
パラメータ引数のクラス名を指定しているため、Filter
ではIPEnabled = 'True'
を指定する必要があります。これにより、IPアドレスを持つネットワークアダプタのみが返されます。
上記のコードスニペットを実行すると、Get-CimInstance
が単一の(または限られた数の)インスタンスのみを返すことがわかります。
単一のCIMインスタンスがあり、探しているプロパティ(IPAddress
)を知っているので、どのようなものか見てみましょう。以下のように、このインスタンスでは、IPAddress
プロパティには3つの文字列が含まれており、IPv6アドレスも含まれています。
さらに要素をフィルタリングする必要があります。WQLはIPAddress
プロパティの値より深くフィルタリングすることができないため、IPv4アドレスを切り出さなければなりません。
IPv4アドレスは通常、配列で最初に定義されます。以下のように0番目を参照してそれを選び出すと、単一のIPv4 IPアドレス文字列のみが返されます。
IPv4アドレスが常に配列の最初の要素であるとは限りません。実際、IPAddressプロパティは配列でない場合もあります。IPの設定はアダプタやさまざまな設定で大きく異なる場合があります。フィルタリングする際には創造的になる必要があります。
結論
コンピュータからIPアドレスを取得するには、まずGet-NetIPAddress
コマンドレットを確認してください。このコマンドを実行できない場合、またはより大きなスクリプトを作成する場合は、Get-CimInstance
とCIMセッションを使用して作業を行うことも検討してください。
Source:
https://adamtheautomator.com/powershell-get-ip-address/