将注册表中的键值添加上MAC地点
2.从头连接网络
试过了3个要领:
ManagementClass最新供给了Disable,Enable要领,但只撑持Vista操纵系统
Shell.dll的要领,,可以实现,但措置惩罚惩罚起来很烦,此外在从头连接时显示“启动中”提示框,不友好。
NetSharingManagerClass 的Disconnect, Connect要领,可以实现,但有一个问题是,会从头更新IP地点,有明显觉得等。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Win32; using System.Net.NetworkInformation; using System.Management; using System.Threading; using System.Runtime.InteropServices; using NETCONLib; namespace DynamicMAC { public class MACHelper { [DllImport("wininet.dll")] private extern static bool InternetGetConnectedState(int Description, int ReservedValue); /// <summary> /// 是否能连接上Internet /// </summary> /// <returns></returns> public bool IsConnectedToInternet() { int Desc = 0; return InternetGetConnectedState(Desc, 0); } /// <summary> /// 获取MAC地点 /// </summary> public string GetMACAddress() { //得到 MAC的注册表键 RegistryKey macRegistry = Registry.LocalMachine.OpenSubKey("SYSTEM").OpenSubKey("CurrentControlSet").OpenSubKey("Control") .OpenSubKey("Class").OpenSubKey("{4D36E972-E325-11CE-BFC1-08002bE10318}"); IList<string> list = macRegistry.GetSubKeyNames().ToList(); IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties(); NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); var adapter = nics.First(o => o.Name == "本地连接"); if (adapter == null) return null; return string.Empty; } /// <summary> /// 设置MAC地点 /// </summary> /// <param></param> public void SetMACAddress(string newMac) { string macAddress; string index = GetAdapterIndex(out macAddress); if (index == null) return; //得到 MAC的注册表键 RegistryKey macRegistry = Registry.LocalMachine.OpenSubKey("SYSTEM").OpenSubKey("CurrentControlSet").OpenSubKey("Control") .OpenSubKey("Class").OpenSubKey("{4D36E972-E325-11CE-BFC1-08002bE10318}").OpenSubKey(index, true); if (string.IsNullOrEmpty(newMac)) { macRegistry.DeleteValue("NetworkAddress"); } else { macRegistry.SetValue("NetworkAddress", newMac); macRegistry.OpenSubKey("Ndi", true).OpenSubKey("params", true).OpenSubKey("NetworkAddress", true).SetValue("Default", newMac); macRegistry.OpenSubKey("Ndi", true).OpenSubKey("params", true).OpenSubKey("NetworkAddress", true).SetValue("ParamDesc", "Network Address"); } Thread oThread = new Thread(new ThreadStart(ReConnect));//new Thread to ReConnect oThread.Start(); } /// <summary> /// 重设MAC地点 /// </summary> public void ResetMACAddress() { SetMACAddress(string.Empty); } /// <summary> /// 从头连接 /// </summary> private void ReConnect() { NetSharingManagerClass netSharingMgr = new NetSharingManagerClass(); INetSharingEveryConnectionCollection connections = netSharingMgr.EnumEveryConnection; foreach (INetConnection connection in connections) { INetConnectionProps connProps = netSharingMgr.get_NetConnectionProps(connection); if (connProps.MediaType == tagNETCON_MEDIATYPE.NCM_LAN) { connection.Disconnect(); //禁用网络 connection.Connect(); //启用网络 } } } /// <summary> /// 生成随机MAC地点 /// </summary> /// <returns></returns> public string CreateNewMacAddress() { //return "0016D3B5C493"; int min = 0; int max = 16; Random ro = new Random(); var sn = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}", ro.Next(min, max).ToString("x"),//0 ro.Next(min, max).ToString("x"),// ro.Next(min, max).ToString("x"), ro.Next(min, max).ToString("x"), ro.Next(min, max).ToString("x"), ro.Next(min, max).ToString("x"),//5 ro.Next(min, max).ToString("x"), ro.Next(min, max).ToString("x"), ro.Next(min, max).ToString("x"), ro.Next(min, max).ToString("x"), ro.Next(min, max).ToString("x"),//10 ro.Next(min, max).ToString("x") ).ToUpper(); return sn; } /// <summary> /// 得到Mac地点及注册表对应Index /// </summary> /// <param></param> /// <returns></returns> public string GetAdapterIndex(out string macAddress) { ManagementClass oMClass = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection colMObj = oMClass.GetInstances(); macAddress = string.Empty; int indexString = 1; foreach (ManagementObject objMO in colMObj) { indexString++; if (objMO["MacAddress"] != null && (bool)objMO["IPEnabled"] == true) { macAddress = objMO["MacAddress"].ToString().WordStr(":", ""); break; } } if (macAddress == string.Empty) return null; else return indexString.ToString().PadLeft(4, ‘0‘); } #region Temp public void noting() { //ManagementClass oMClass = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementClass oMClass = new ManagementClass("Win32_NetworkAdapter"); ManagementObjectCollection colMObj = oMClass.GetInstances(); foreach (ManagementObject objMO in colMObj) { if (objMO["MacAddress"] != null) { if (objMO["Name"] != null) { //objMO.InvokeMethod("Reset", null); objMO.InvokeMethod("Disable", null);//Vista only objMO.InvokeMethod("Enable", null);//Vista only } //if ((bool)objMO["IPEnabled"] == true) //{ // //Console.WriteLine(objMO["MacAddress"].ToString()); // //objMO.SetPropertyValue("MacAddress", CreateNewMacAddress()); // //objMO["MacAddress"] = CreateNewMacAddress(); // //objMO.InvokeMethod("Disable", null); // //objMO.InvokeMethod("Enable", null); // //objMO.Path.ReleaseDHCPLease(); // var iObj = objMO.GetMethodParameters("EnableDHCP"); // var oObj = objMO.InvokeMethod("ReleaseDHCPLease", null, null); // Thread.Sleep(100); // objMO.InvokeMethod("RenewDHCPLease", null, null); //} } } } public void no() { Shell32.Folder networkConnectionsFolder = GetNetworkConnectionsFolder(); if (networkConnectionsFolder == null) { Console.WriteLine("Network connections folder not found."); return; } Shell32.FolderItem2 networkConnection = GetNetworkConnection(networkConnectionsFolder, string.Empty); if (networkConnection == null) { Console.WriteLine("Network connection not found."); return; } Shell32.FolderItemVerb verb; try { IsNetworkConnectionEnabled(networkConnection, out verb); verb.DoIt(); Thread.Sleep(1000); IsNetworkConnectionEnabled(networkConnection, out verb); verb.DoIt(); } catch (ArgumentException ex) { Console.WriteLine(ex.Message); } } /// <summary> /// Gets the Network Connections folder in the control panel. /// </summary> /// <returns>The Folder for the Network Connections folder, or null if it was not found.</returns> static Shell32.Folder GetNetworkConnectionsFolder() { Shell32.Shell sh = new Shell32.Shell(); Shell32.Folder controlPanel = sh.NameSpace(3); // Control panel Shell32.FolderItems items = controlPanel.Items(); foreach (Shell32.FolderItem item in items) { if (item.Name == "网络连接") return (Shell32.Folder)item.GetFolder; } return null; } /// <summary> /// Gets the network connection with the specified name from the specified shell folder. /// </summary> /// <param>The Network Connections folder.</param> /// <param>The name of the network connection.</param> /// <returns>The FolderItem for the network connection, or null if it was not found.</returns> static Shell32.FolderItem2 GetNetworkConnection(Shell32.Folder networkConnectionsFolder, string connectionName) { Shell32.FolderItems items = networkConnectionsFolder.Items(); foreach (Shell32.FolderItem2 item in items) { if (item.Name == "本地连接") { return item; } } return null; } /// <summary> /// Gets whether or not the network connection is enabled and the command to enable/disable it. /// </summary> /// <param>The network connection to check.</param> /// <param>On return, receives the verb used to enable or disable the connection.</param> /// <returns>True if the connection is enabled, false if it is disabled.</returns> static bool IsNetworkConnectionEnabled(Shell32.FolderItem2 networkConnection, out Shell32.FolderItemVerb enableDisableVerb) { Shell32.FolderItemVerbs verbs = networkConnection.Verbs(); foreach (Shell32.FolderItemVerb verb in verbs) { if (verb.Name == "启用(&A)") { enableDisableVerb = verb; return false; } else if (verb.Name == "停用(&B)") { enableDisableVerb = verb; return true; } } throw new ArgumentException("No enable or disable verb found."); } #endregion } }
操纵网卡类: