指定したネットワーク名の固定IPアドレスをレジストリから取得する。
GetIpConfiguration()でも取得できるが、このメソッド単体で動く簡易版。
通常はWMIを使って取得するが、LANケーブルが接続されていなかったり、デバイスが無効になっていると正常に取得できない。
そのため、レジストリを直接読んで取得する。
ただし、WindowsXPのみ動作確認済み。
引数には、ネットワーク名を変更していなければ、通常は"ローカル エリア接続"を入れることになるだろう。
private string GetIpAddress(string networkName)
{
try
{
string ipAddress = null;
RegistryKey lmKey = Registry.LocalMachine;
// Adapterキー取得
RegistryKey networkKey = lmKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Network");
if (networkKey == null)
throw new Exception("ネットワークレジストリ情報が見つかりません。");
string[] subkeyNames = networkKey.GetSubKeyNames();
if (subkeyNames == null || subkeyNames.Length == 0)
throw new Exception("ネットワークレジストリ情報が見つかりません。");
RegistryKey netKey = null;
foreach (string subkeyName in subkeyNames)
{
netKey = networkKey.OpenSubKey(subkeyName);
if ((string)netKey.GetValue("Class") == "Net")
break;
}
if (netKey == null)
throw new Exception("ネットワークレジストリ情報が見つかりません。");
// アダプター取得
string[] adapterKeyNames = netKey.GetSubKeyNames();
if (adapterKeyNames == null || adapterKeyNames.Length == 0)
throw new Exception("ネットワークアダプタレジストリ情報が見つかりません。");
foreach (string adapterKeyName in adapterKeyNames)
{
// コネクションキー取得
RegistryKey connectionKey = netKey.OpenSubKey(adapterKeyName + "file://Connection/");
if (connectionKey == null)
continue;
// MediaSubType=1(LAN)となっているものを取得
Int32 mediaSubType = (Int32)connectionKey.GetValue("MediaSubType");
if (mediaSubType != 0x00000001)
continue;
// ネットワーク名取得
string name = (string)connectionKey.GetValue("Name");
if (name == networkName)
{
// TCP/IPキー取得
RegistryKey tcpipKey = lmKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\" + adapterKeyName);
if (tcpipKey == null)
throw new Exception("TCP/IPレジストリ情報が見つかりません。");
// DHCPが有効のときはIPアドレスを取得しない
Int32 enableDHCP = (Int32)tcpipKey.GetValue("EnableDHCP");
if (enableDHCP == 1)
throw new Exception("DHCPが有効のため、固定IPアドレスを取得できません。");
// IP情報取得
string[] ipAddresses = (string[])tcpipKey.GetValue("IPAddress");
if (ipAddresses == null || ipAddresses.Length == 0)
throw new Exception("固定IPアドレス情報が見つかりません。");
foreach (string address in ipAddresses)
{
if (address.Contains(m_ipAdress_substr))
{
ipAddress = address;
break;
}
}
break;
}
}
return ipAddress;
}
catch (Exception)
{
throw;
}
}