3

我正在使用此代码将 IP 地址添加到网卡:

[DllImport("iphlpapi.dll", SetLastError = true)]
        private static extern UInt32 AddIPAddress(UInt32 address, UInt32 ipMask, int ifIndex, out IntPtr nteContext,
                                                  out IntPtr nteInstance);

public static UInt32 AddIpAddressToInterface(string ipAddress, string subnetMask, int ifIndex)
        {
            var ipAdd = System.Net.IPAddress.Parse(ipAddress);
            var subNet = System.Net.IPAddress.Parse(subnetMask);
            unsafe
            {
                var nteContext = 0;
                var nteInstance = 0;
                IntPtr ptrNteContext;
                var ptrNteInstance = new IntPtr(nteInstance);
                return AddIPAddress((uint)BitConverter.ToInt32(ipAdd.GetAddressBytes(), 0), (uint)BitConverter.ToInt32(subNet.GetAddressBytes(), 0), ifIndex, out ptrNteContext,
                                    out ptrNteInstance);
            }
        }

它似乎工作正常,但我注意到如果我重新启动机器,IP 将被删除。此外,如果我从命令行执行 ipconfig,我可以看到它们,但在“高级 TCP/IP 设置”对话框中看不到它们。那么,真的添加了 IPS 还是我需要做其他事情来确保 IP 绑定到网卡?

通过命令行获取 IP 地址

在此处输入图像描述

4

2 回答 2

3

实际上,IP 已添加,但 AddIPAddress 是非持久的:

AddIPAddress 函数添加的 IPv4 地址不是持久的。IPv4 地址仅在适配器对象存在时才存在。重新启动计算机会破坏 IPv4 地址,手动重置网络接口卡 (NIC) 也是如此。此外,某些 PnP 事件可能会破坏地址。

要创建持久的 IPv4 地址,可以使用 Windows Management Instrumentation (WMI) 控件中 Win32_NetworkAdapterConfiguration 类的 EnableStatic 方法。netsh 命令还可用于创建持久 IPv4 地址。

来源:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa365801%28v=vs.85%29.aspx

您可以使用 WMI.NET(System.Management 命名空间)执行 EnableStatic 方法,例如:

var q = new ObjectQuery("select * from Win32_NetworkAdapterConfiguration where InterfaceIndex=25");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(q);

foreach (ManagementObject nic in searcher.Get()) 
{
    ManagementBaseObject newIP = nic.GetMethodParameters("EnableStatic");
    newIP["IPAddress"] = new string[]{"192.168.0.1"};
    newIP["SubnetMask"] = new string[]{"255.255.255.0"};
    nic.InvokeMethod("EnableStatic", newIP, null); 
}
于 2013-08-15T15:26:20.483 回答
1

如前所述,AddIPAddress所有iphlpapi.dll显示和控制动态配置都不会持久化。

您可以设置静态持久配置,该配置将显示在 TCP/IP 设置对话框中,使用netsh-runnetsh interface ipv4 set /?来查看如何。它可以通过INetCfg界面以编程方式访问,但我认为其中一些是未记录的。

WMI 接口是混合来自两个来源的东西的包装器,这就是我建议不要使用它们的原因(正如您所注意到的,它们不会配置断开连接的 NIC)。

于 2013-08-15T15:04:21.043 回答