C#修改MAC地址类的实例_C#教程-查字典教程网
C#修改MAC地址类的实例
C#修改MAC地址类的实例
发布时间:2016-12-28 来源:查字典编辑
摘要:1.更新MAC地址将注册表中的键值添加上MAC地址2.重新连接网络试过了3个方法:ManagementClass最新提供了Disable,E...

1.更新MAC地址

将注册表中的键值添加上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 name="newMac"></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 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 == "网络连接")

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#教程学习
    热门C#教程学习
    编程开发子分类