【VB.NET】ネットワーク情報の取得 | LDKの徒然日記

LDKの徒然日記

脱力系エンジニアの日常を綴る・・・

VB.NETでWMIを利用してネットワーク情報を取得してみる。
通常の業務アプリケーションでは、サブネットマスクやゲートウェイやDNSを必要とする処理は
あまりないと思いますが。

下記参照設定が必要

Imports System.Management
Imports System.Net

''' <summary>
''' IPアドレスを取得する
''' </summary>
''' <returns>IPAddress</returns>
''' <remarks></remarks>
Protected Function GetIpAddress() As String
GetIpAddress = String.Empty

Dim ipa As IPAddress
Dim iphEntry As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
For Each ipAddr As IPAddress In iphEntry.AddressList
If ipAddr.AddressFamily = Sockets.AddressFamily.InterNetwork Then
ipa = ipAddr
'◆IPアドレス取得
GetIpAddress = ipa.ToString
Exit For
End If
Next
End Function

''' <summary>
''' ネットワーク情報を取得する ※指定したIPアドレスをの情報を取得することも可能
''' <br>HashKey情報:IPAddress,IPSubnet,IPDefaultGateway,DNS01,DNS02</br>
''' </summary>
''' <param name="pIpAddress">IPアドレス ※オプショナル</param>
''' <returns>ネットワーク設定ハッシュ</returns>
''' <remarks></remarks>
Protected Function GetNetworkConfig(Optional ByVal pIpAddress As String = "") As Hashtable

Dim wkIpAddress As String = String.Empty

If pIpAddress.Equals(String.Empty) = True Then
wkIpAddress = GetIpAddress()
Else
wkIpAddress = pIpAddress
End If

Dim ht As New Hashtable

'◆LINQによる取得
Dim query1 As New ManagementObjectSearcher("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")
Dim queryCollection1 As ManagementObjectCollection = query1.[Get]()
For Each mo As ManagementObject In queryCollection1
If mo("IPAddress")(0).Equals(wkIpAddress) Then

'□IPアドレス
If IsNothing(mo("IPAddress")) = True Then
ht.Add("IPAddress", String.Empty)
Else
ht.Add("IPAddress", mo("IPAddress")(0))
End If

'□サブネットマスク
If IsNothing(mo("IPSubnet")) = True Then
ht.Add("IPSubnet", String.Empty)
Else
ht.Add("IPSubnet", mo("IPSubnet")(0))
End If

'□デフォルトゲートウェイ
If IsNothing(mo("DefaultIPGateway")) = True Then
ht.Add("IPDefaultGateway", String.Empty)
Else
ht.Add("IPDefaultGateway", mo("DefaultIPGateway")(0))
End If

'□DNS
If IsNothing(mo("DNSServerSearchOrder")) = True Then
ht.Add("DNS01", String.Empty)
ht.Add("DNS02", String.Empty)
Else
Select Case mo("DNSServerSearchOrder").length
Case 1
ht.Add("DNS01", mo("DNSServerSearchOrder")(0))
ht.Add("DNS02", String.Empty)
Case 2
ht.Add("DNS01", mo("DNSServerSearchOrder")(0))
ht.Add("DNS02", mo("DNSServerSearchOrder")(1))
End Select
End If

Exit For
End If
Next

GetNetworkConfig = ht

End Function

□使用例
Dim ht As Hashtable
ht = GetNetworkConfig()

Console.WriteLine(ht.Item("IPAddress")) 'IPアドレス
Console.WriteLine(ht.Item("IPSubnet")) 'サブネットマスク
Console.WriteLine(ht.Item("IPDefaultGateway")) 'デフォルトゲートウェイ
Console.WriteLine(ht.Item("DNS01")) 'プライマリDNS
Console.WriteLine(ht.Item("DNS02")) 'セカンダリDNS