C#修改Windows系統(tǒng)信息:
C#修改MAC地址類及操作網(wǎng)卡類
1.更新MAC地址
將注冊(cè)表中的鍵值添加上MAC地址
2.重新連接網(wǎng)絡(luò)
試過(guò)了3個(gè)方法:1,ManagementClass最新提供了Disable,Enable方法,但只支持Vista操作系統(tǒng)
2,Shell.dll的方法,可以實(shí)現(xiàn),但處理起來(lái)很煩,另外在重新連接時(shí)顯示“啟動(dòng)中”提示框,不友好。3,NetSharingManagerClass 的Disconnect, Connect方法,可以實(shí)現(xiàn),但有一個(gè)問(wèn)題是,會(huì)重新更新IP地址,有明顯感覺(jué)等。
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的注冊(cè)表鍵 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> /// 設(shè)置MAC地址 /// </summary> /// <param name="newMac"></param> public void SetMACAddress(string newMac) { string macAddress; string index = GetAdapterIndex(out macAddress); if (index == null) return; //得到 MAC的注冊(cè)表鍵 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> /// 重設(shè)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(); //禁用網(wǎng)絡(luò) connection.Connect(); //啟用網(wǎng)絡(luò) } } } /// <summary> /// 生成隨機(jī)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地址及注冊(cè)表對(duì)應(yīng)Index /// </summary> /// <param name="macAddress"></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().Replace(":", ""); 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 == "網(wǎng)絡(luò)連接") return (Shell32.Folder)item.GetFolder; } return null; } /// <summary> /// Gets the network connection with the specified name from the specified shell folder. /// </summary> /// <param name="networkConnectionsFolder">The Network Connections folder.</param> /// <param name="connectionName">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 name="networkConnection">The network connection to check.</param> /// <param name="enableDisableVerb">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 } }
C#操作網(wǎng)卡類:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Management; using System.Collections; namespace NetWorkControl { public partial class Form1 : Form { public Form1() { InitializeComponent(); NetWorkList(); } /// <summary> /// 網(wǎng)卡列表 /// </summary> public void NetWorkList() { string manage = "SELECT * From Win32_NetworkAdapter"; ManagementObjectSearcher searcher = new ManagementObjectSearcher(manage); ManagementObjectCollection collection = searcher.Get(); List<string> netWorkList = new List<string>(); foreach (ManagementObject obj in collection) { netWorkList.Add(obj["Name"].ToString()); } this.cmbNetWork.DataSource = netWorkList; } /// <summary> /// 禁用網(wǎng)卡 /// </summary>5 /// <param name="netWorkName">網(wǎng)卡名</param> /// <returns></returns> public bool DisableNetWork(ManagementObject network) { try { network.InvokeMethod("Disable", null); return true; } catch { return false; } } /// <summary> /// 啟用網(wǎng)卡 /// </summary> /// <param name="netWorkName">網(wǎng)卡名</param> /// <returns></returns> public bool EnableNetWork(ManagementObject network) { try { network.InvokeMethod("Enable", null ); return true; } catch { return false; } } /// <summary> /// 網(wǎng)卡狀態(tài) /// </summary> /// <param name="netWorkName">網(wǎng)卡名</param> /// <returns></returns> public bool NetWorkState(string netWorkName) { string netState = "SELECT * From Win32_NetworkAdapter"; ManagementObjectSearcher searcher = new ManagementObjectSearcher(netState); ManagementObjectCollection collection = searcher.Get(); foreach (ManagementObject manage in collection) { if (manage["Name"].ToString() == netWorkName ) { return true; } } return false; } /// <summary> /// 得到指定網(wǎng)卡 /// </summary> /// <param name="networkname">網(wǎng)卡名字</param> /// <returns></returns> public ManagementObject NetWork(string networkname) { string netState = "SELECT * From Win32_NetworkAdapter"; ManagementObjectSearcher searcher = new ManagementObjectSearcher(netState); ManagementObjectCollection collection = searcher.Get(); foreach (ManagementObject manage in collection) { if (manage["Name"].ToString() == networkname) { return manage; } } return null; } private void btnStart_Click(object sender, EventArgs e) { if (NetWorkState(this.cmbNetWork.SelectedValue.ToString())) { if (!EnableNetWork(NetWork(this.cmbNetWork.SelectedValue.ToString()))) { MessageBox.Show("開(kāi)啟網(wǎng)卡失敗!"); } else { MessageBox.Show("開(kāi)啟網(wǎng)卡成功!"); } } else { MessageBox.Show("網(wǎng)卡己開(kāi)啟!"); } NetWorkList(); } private void btnStop_Click(object sender, EventArgs e) { if (NetWorkState(this.cmbNetWork.SelectedValue.ToString())) { if (!DisableNetWork(NetWork(this.cmbNetWork.SelectedValue.ToString()))) { MessageBox.Show("禁用網(wǎng)卡失敗!"); } else { MessageBox.Show("禁用網(wǎng)卡成功!"); } } else { MessageBox.Show("網(wǎng)卡己禁用!"); } NetWorkList(); } } }
原文鏈接:C#修改MAC地址及操作網(wǎng)卡