I have some code which I'm currently using to change the static-IP of a network adaptor. When run on a Windows XP 32-bit machine (both phsyical and VM) there is a slight pause (~1 second) when setting the IP address, but it does seem to change the IP.
When run on a Windows 7 64-bit machine, it fails to change the IP address. There is no pause when it attempts to make the change, and no exceptions are thrown.
I've done a fair amount of googling and most the advise seems to be to simply run as Administrator. I've tried right-clicking on the executable and choosing 'run as administrator', I've tried creating a shortcut and setting it to run as administrator, and I've tried updating the Manifest file (it does ask for admin priviledges on launch, but still doesn't change the IP address.)
Can anyone offer any advice?
Code follows:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management; // You will need to add a reference for System.Management!
namespace NetAdapt
{
class Program
{
static void Main(string[] args)
{
// First display all network adaptors
DisplayNetworkAdaptors(-1);
// Now try to set static IP, subnet mask and default gateway for adaptor with
// index of 1 (may be different for your machine!)
SetIP(1,
new string[] { "10.10.1.222" },
new string[] { "255.255.255.0" },
new string[] { "10.10.1.10" });
// Now display network adaptor settings for adaptor 1 (may be different for your machine!)
DisplayNetworkAdaptors(1);
Console.ReadLine();
}
private static void SetIP(int index, string[] newIPAddress, string[] newSubnetMask, string[] newGateway)
{
ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection objMOC = objMC.GetInstances();
foreach (ManagementObject objMO in objMOC)
{
if (!(bool)objMO["IPEnabled"]) continue;
try
{
//Only change for device specified
if ((uint)objMO["Index"] == index)
{
ManagementBaseObject objNewIP = null;
ManagementBaseObject objSetIP = null;
ManagementBaseObject objNewGate = null;
objNewIP = objMO.GetMethodParameters("EnableStatic");
objNewGate = objMO.GetMethodParameters("SetGateways");
objNewGate["DefaultIPGateway"] = newGateway;
objNewIP["IPAddress"] = newIPAddress;
objNewIP["SubnetMask"] = newSubnetMask;
objSetIP = objMO.InvokeMethod("EnableStatic", objNewIP, null);
objSetIP = objMO.InvokeMethod("SetGateways", objNewGate, null);
Console.WriteLine("Successfully changed IP!");
}
}
catch (Exception ex)
{
Console.WriteLine("Exception setting IP: " + ex.Message);
}
}
}
private static void DisplayNetworkAdaptors(int index)
{
ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection objMOC = objMC.GetInstances();
foreach (ManagementObject objMO in objMOC)
{
try
{
// TCP enabled NICs only
if (!(bool)objMO["IPEnabled"]) continue;
// If index is -1 then display all network adaptors, otherwise only
// display adaptor whose index matches parameter
if ((index != -1) && ((uint)objMO["Index"] != index)) continue;
Console.WriteLine("Caption : " + (string)objMO["Caption"]);
string[] defaultGateways=(string[])objMO["DefaultIPGateway"];
if (defaultGateways != null)
{
for (int x = 0; x < defaultGateways.Count(); x++)
{
Console.WriteLine(string.Format("DefaultIPGateway{0} : {1}", x, defaultGateways[x]));
}
}
else
{
Console.WriteLine("DefaultIPGateway : NULL");
}
Console.WriteLine("Description : " + (string)objMO["Description"]);
Console.WriteLine("DHCPEnabled : " + (bool)objMO["DHCPEnabled"]);
Console.WriteLine("DHCPServer : " + (string)objMO["DHCPServer"]);
Console.WriteLine("Index : " + (uint)objMO["Index"]);
string[] ipAddresses = (string[])objMO["IPAddress"];
if (ipAddresses != null)
{
for (int x = 0; x < ipAddresses.Count(); x++)
{
Console.WriteLine(string.Format("IPAddress{0} : {1}", x, ipAddresses[x]));
}
}
else
{
Console.WriteLine("IPAddress : NULL");
}
Console.WriteLine("IPEnabled : " + (bool)objMO["IPEnabled"]);
string[] ipSubnets = (string[])objMO["IPSubnet"];
if (ipSubnets != null)
{
for (int x = 0; x < ipSubnets.Count(); x++)
{
Console.WriteLine(string.Format("IPSubnet{0} : {1}", x, ipSubnets[x]));
}
}
else
{
Console.WriteLine("IPSubnet : NULL");
}
Console.WriteLine("MACAddress : " + (string)objMO["MACAddress"]);
Console.WriteLine();
}
catch (Exception ex)
{
Console.WriteLine("Exception getting network adaptors: " + ex.Message);
}
}
}
}
}
Ok, finally managed to find a sort-of solution to the problem by examining the following from Code Project:
http://www.codeproject.com/Articles/19827/Chameleon-Connection-Settings-Manager
In the above author's code he sets the static IP using the following code:
objMO.InvokeMethod("EnableStatic", new object[] { newIPAddress, newSubnetMask });
objMO.InvokeMethod("SetGateways", new object[] { newGateway, new string[] { "1" } });
...which works on Windows 7 fine, but not on Windows XP. In my own code I've resorted to interrogating System.Environment.OSVersion.Version and choosing my method of setting the IP according to whether I'm running on XP or Windows 7.