2009年09月29日

固定IPアドレス取得 GetIpAddress()

指定したネットワーク名の固定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;
        }
    }

posted by サブリン at 13:51| Comment(0) | TrackBack(0) | Network (.NET) | このブログの読者になる | 更新情報をチェックする

2009年09月28日

ネットワーク情報設定 SetIPConfiguration()

ネットワークの設定を行う。
IPアドレスを設定する際、LANケーブルが接続されていない場合はレジストリを直接変える。
LANケーブルが接続されている場合はWMIを使って設定する。
何故かって?
レジストリを直接さわるのは怖いから、できればWMIを使ったほうが安全。
DHCPは有効にしていても、IPアドレスを設定すると自動的に無効になるようだ。
ただし、WinXP限定。

SetIPConfiguration()関数
    public static void SetIPConfiguration(IPConfig config)
    {
        try
        {
            ObjectQuery oq = new ObjectQuery("select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE");
            ManagementObjectSearcher mos = new ManagementObjectSearcher(oq);
            foreach (ManagementObject mo in mos.Get())
            {
                if ((string)mo.Properties["Caption"].Value != config.Adapter)
                    continue;

                if (config.DHCPEnable == true)
                {
                    // DHCPを有効化
                    // DHCPが無効となっていた場合のみ処理をする
                    if ((Boolean)mo.Properties["DHCPEnabled"].Value == false)
                    {
                        UInt32 res = (UInt32)mo.InvokeMethod("EnableDHCP", null);
                        if (res == 94)  // DHCPエラー(ケーブルが接続されていない)
                        {
                            // ケーブルが接続されてなく、有効化できない場合は直接レジストリを変更
                            RegistryKey lmKey = Registry.LocalMachine;
                            RegistryKey tcpipKey = lmKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\" + config.AdapterKey, true);
                            if (tcpipKey == null)
                                return;

                            tcpipKey.SetValue("EnableDHCP", 1);
                            tcpipKey.SetValue("IPAddress", "0.0.0.0");
                            tcpipKey.SetValue("SubnetMask", "0.0.0.0");
                            tcpipKey.SetValue("DefaultGateway", "");
                        }
                    }
                }
                else
                {
                    // IPアドレスの設定
                    // DHCPは自動で無効となる
                    object[] args = { new string[] { config.IPAddress }, new string[] { config.SubNetMask } };
                    mo.InvokeMethod("EnableStatic", args);

                    args = new object[] { new string[] { config.DefaultGateway }, null };
                    mo.InvokeMethod("SetGateways", args);

                    args = new object[] { new string[] { config.NameServer }, null };
                    mo.InvokeMethod("SetDNSServerSearchOrder", args);
                }
                break;
            }
        }
        catch (Exception)
        {
            throw;
        }
    }

posted by サブリン at 19:21| Comment(0) | TrackBack(0) | Network (.NET) | このブログの読者になる | 更新情報をチェックする

ネットワーク情報取得 GetNetConfiguration()

ネットワーク情報を取得する。
これもLANケーブルをつないでないと正常に取得できないため、レジストリから取得する。
WindowsXPのみ動作確認済み。

取得用クラスとしてNetConfigクラスを作成する。

NetConfigクラス
    public class NetConfig
    {
        private string m_machineName;
        private List<IPConfig> m_ipConfig;

        public string MachineName
        {
            set { m_machineName = value; }
            get { return m_machineName; }
        }

        public List<IPConfig> IPConfig
        {
            set { m_ipConfig = value; }
            get { return m_ipConfig; }
        }

        public NetConfig()
        {
            m_ipConfig = new List<IPConfig>();
        }
    }



    public NetConfig GetNetConfiguration()
    {
        NetConfig config = new NetConfig();

        try
        {
            RegistryKey lmKey = Registry.LocalMachine;

            // コンピュータ名取得
            RegistryKey machineNameKey = lmKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters");
            if (machineNameKey == null)
                return config;

            string machineName = (string)machineNameKey.GetValue("Hostname");
            if (machineName != null)
                config.MachineName = machineName;

            // Adapterキー取得
            RegistryKey networkKey = lmKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Network");
            string[] subkeyNames = networkKey.GetSubKeyNames();
            RegistryKey netKey = null;
            foreach (string subkeyName in subkeyNames)
            {
                netKey = networkKey.OpenSubKey(subkeyName);

                if ((string)netKey.GetValue("Class") == "Net")
                    break;
            }

            // アダプター取得
            string[] adapterKeyNames = netKey.GetSubKeyNames();
            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");

                // IP情報取得
                IPConfig ipConfig = GetIPConfiguration(adapterKeyName, name);
                if (ipConfig == null)
                    continue;

                config.IPConfig.Add(ipConfig);
            }

        }
        catch (Exception)
        {
            throw;
        }

        return config;
    }

posted by サブリン at 16:44| Comment(0) | TrackBack(0) | Network (.NET) | このブログの読者になる | 更新情報をチェックする

IP情報取得 GetIPConfiguration()

ネットワークのIP情報をネットワーク名称から取得する。
WMIを使って取得できればよかったけど、固定IPの場合、LANケーブルを挿してないと正常に取得できない。
ネットワーク設定でIPアドレスを指定しているのに、変な話だ。
ということで、レジストリから情報を取得する。
ただし、WindowsXPが対象。

取得する項目がたくさんあるため、IPConfigクラスを作成して取得する。
取得項目は、
・ネットワーク名(引数から取得)
・アダプタ名称
・アダプタキー(引数から取得)
・DHCP有効/無効
・IPアドレス
・サブネットマスク
・デフォルトゲートウェイ
・ネームサーバー

取得用クラス IPConfig
    public class IPConfig
    {
        private string m_name;
        private string m_adapter;
        private string m_adapterKey;
        private Boolean m_dhcpEnable;
        private string  m_ipAddress;
        private string  m_subnetMask;
        private string  m_defaultGateway;
        private string  m_nameServer;

        public string Name
        {
            set { m_name = value; }
            get { return m_name; }
        }

        public string Adapter
        {
            set { m_adapter = value; }
            get { return m_adapter; }
        }

        public string AdapterKey
        {
            set { m_adapterKey = value; }
            get { return m_adapterKey; }
        }

        public Boolean DHCPEnable
        {
            set { m_dhcpEnable = value; }
            get { return m_dhcpEnable; }
        }

        public string IPAddress
        {
            set { m_ipAddress = value; }
            get { return m_ipAddress; }
        }

        public string SubNetMask
        {
            set { m_subnetMask = value; }
            get { return m_subnetMask; }
        }

        public string DefaultGateway
        {
            set { m_defaultGateway = value; }
            get { return m_defaultGateway; }
        }

        public string NameServer
        {
            set { m_nameServer = value; }
            get { return m_nameServer; }
        }

    }



    private IPConfig GetIPConfiguration(string adapterKeyName, string networkName)
    {
        IPConfig config = new IPConfig();

        try
        {
            // アダプタの存在確認
            string adapterName = GetNetworkAdapterName(networkName);
            if (adapterName == "")
                return null;

            config.Name = networkName;
            config.Adapter = adapterName;
            config.AdapterKey = adapterKeyName;
                
            RegistryKey lmKey = Registry.LocalMachine;
            RegistryKey tcpipKey = lmKey.OpenSubKey(
                "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\" + 
                adapterKeyName);
            if (tcpipKey == null)
                return null;

            Int32 enableDHCP = (Int32)tcpipKey.GetValue("EnableDHCP");
            config.DHCPEnable = enableDHCP == 0 ? false : true;

            string[] ipAddress = (string[])tcpipKey.GetValue("IPAddress");
            if (ipAddress != null && ipAddress.Length != 0)
                config.IPAddress = ipAddress[0];

            string[] subnetMask = (string[])tcpipKey.GetValue("SubnetMask");
            if (subnetMask != null && subnetMask.Length != 0)
                config.SubNetMask = subnetMask[0];

            string[] defaultGateway = (string[])tcpipKey.GetValue("DefaultGateway");
            if (defaultGateway != null && defaultGateway.Length != 0)
                config.DefaultGateway = defaultGateway[0];

            string nameServer = (string)tcpipKey.GetValue("NameServer");
            if (nameServer != null)
                config.NameServer = nameServer;

        }
        catch (Exception)
        {
            throw;
        }

        return config;
    }

    ※引数のadapterKeyNameはGetNetConfiguration()を参照

posted by サブリン at 16:26| Comment(0) | TrackBack(0) | Network (.NET) | このブログの読者になる | 更新情報をチェックする

ネットワークアダプタ名取得 GetNetworkAdapterName()

ネットワーク名称からネットワークアダプタ名を取得する。
WMIを使って取得する。

GetNetworkAdapterName関数
public string GetNetworkAdapterName(string networkName)
{
    string adapter = null;

    try
    {
        ObjectQuery oq = new ObjectQuery("select * from Win32_NetworkAdapter");
        ManagementObjectSearcher mos = new ManagementObjectSearcher(oq);
        foreach (ManagementObject mo in mos.Get())
        {
            string id = (string)mo.Properties["NetConnectionID"].Value;
            if (id == networkName)
            {
                adapter = (string)mo.Properties["Caption"].Value;
                break;
            }
        }
     }
    catch(Exception)
    {
        throw;
    }
    return adapter;
}
posted by サブリン at 14:54| Comment(0) | TrackBack(0) | Network (.NET) | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。