1

IPアドレスなどを静的に設定するか、自動的に設定する(DHCP)ことができる簡単なネットワーク構成ツールを、すべてWMIを使用して作成しようとしています。

残念ながら、アドレスの設定は静的に1回だけ機能します。したがって、以下のテスト関数を1回実行すると、すべてが完全に機能します(// DYNAMICのブレークポイントを忘れないでください!)。ただし、2回目に、ネットワークアダプタのコントロールパネルのプロパティページで結果を確認すると、IPアドレスとサブネットマスクは空のままになります。もちろん、スローされる例外はなく、メソッド呼び出しの結果は常にゼロ(0)です。コードは、2台の異なるWindows 7マシンで、そしてもちろん管理者としてテストされました。

void Test()
{

    // find management object
    ManagementClass networkManagementClass = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection networkManagement = networkManagementClass.GetInstances();
    ManagementObject adapter = null;
    foreach (ManagementObject mo in networkManagement)
    {
        if ((bool)mo["IPEnabled"] && (string)mo["Caption"] == "[00000012] Intel(R) 82577LM Gigabit Network Connection")
        {
            adapter = mo;
            break;
        }
    }

    // STATIC

    var val = adapter.InvokeMethod("EnableStatic", new object[] {
        new string[] { "192.168.1.99" },
        new string[] { "255.255.255.0" }
    });

    val = adapter.InvokeMethod("SetGateways", new object[] {
        new string[] { "192.168.1.254" },
        new UInt16[] { 1 }
    });

    val = adapter.InvokeMethod("SetDNSServerSearchOrder", new object[] {
        new string[] { "192.168.1.254" }
    });

    // DYNAMIC

    adapter.InvokeMethod("SetDNSServerSearchOrder", new object[] { new string[0] });

    adapter.InvokeMethod("EnableDHCP", new object[] { });

}
4

1 に答える 1

1

最後に、この (私が推測する) Windows バグの回避策を見つけました: WMI 呼び出しの前に、レジストリに直接正しい値を入力してください:

// workaround of windows bug (windows refused to apply static ip in network properties dialog)
var settingID = adapter.GetPropertyValue("SettingID"); // adapter = the management object
using (var regKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\" + settingID, true))
{
    regKey.SetValue("EnableDHCP", 0);
    regKey.SetValue("IPAddress", networkState.IPAddress, RegistryValueKind.MultiString);
    regKey.SetValue("SubnetMask", networkState.SubnetMask, RegistryValueKind.MultiString);
}

私にとって魅力のように機能します。楽しむ :)

于 2012-08-10T17:08:28.187 に答える