使用.Net中的iphlpapi.dll在x64机器上添加新的IP地址

时间:2013-08-15 14:23:36

标签: c# .net dllimport unmanaged

我正在使用此代码将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绑定到nic卡?

IP Addresses via command line

enter image description here

2 个答案:

答案 0 :(得分: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 Namespace)执行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); 
}

答案 1 :(得分:1)

如上所述,AddIPAddress和所有iphlpapi.dll显示并控制动态配置,但不会保留。

您可以使用netsh设置静态持久配置(将在TCP / IP设置对话框中显示) - 运行netsh interface ipv4 set /?以查看方式。它可以通过INetCfg接口以编程方式访问,但我认为其中一些没有文档。

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