我正在使用此代码将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卡?
答案 0 :(得分:3)
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)。