前々回、取得した Domain オブジェクトの表示で、ドメインコントローラのIPアドレスについては Web アプリの場合、ローカルホストだと「::1」と表示されてしまうことがある と書きました。
Windows アプリの場合は、ListBox で選択したドメインコントローラ(DomainController クラス)の IPAddress プロパティの値をそのまま表示してますが、Web アプリの場合は次のメソッドからドメインコントローラのIPアドレスを取得するようにしました。
※名前空間 System.Net と System.Net.Sockets をインポートしてます。
VB
Private Function GetDomainControllerIPAddress(dc As DomainController) As String
If dc.IPAddress.Contains(".") Then 'IPv4の時
Return dc.IPAddress
End If
Dim ip = IPAddress.Parse(dc.IPAddress)
If IPAddress.IsLoopback(ip) Then 'ループバックの時
Dim addresses = Dns.GetHostAddresses(String.Empty) 'ローカルホストのIPアドレス
ip = addresses.FirstOrDefault(Function(address) address.AddressFamily = AddressFamily.InterNetwork) 'IPv4のアドレス
If ip Is Nothing Then 'IPv4のアドレスがない時
ip = addresses(0) '先頭のIPv6のアドレス
End If
Return ip.ToString()
End If
Return dc.IPAddress
End Function
C#
private string GetDomainControllerIPAddress(DomainController dc)
{
if (dc.IPAddress.Contains(".")) //IPv4の時
{
return dc.IPAddress;
}
var ip = IPAddress.Parse(dc.IPAddress);
if (IPAddress.IsLoopback(ip)) //ループバックの時
{
var addresses = Dns.GetHostAddresses(String.Empty); //ローカルホストのIPアドレス
ip = addresses.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork); //IPv4のアドレス
if (ip == null) //IPv4のアドレスがない時
{
ip = addresses[0]; //先頭のIPv6のアドレス
}
return ip.ToString();
}
return dc.IPAddress;
}
IPv4 を優先してます。ループバックの時は DNS サーバから IPアドレスを取得してます。