C#修改MAC地址类的实例
2023-06-13 09:14:47 时间
1.更新MAC地址
将注册表中的键值添加上MAC地址
2.重新连接网络
试过了3个方法:
ManagementClass最新提供了Disable,Enable方法,但只支持Vista操作系统
Shell.dll的方法,可以实现,但处理起来很烦,另外在重新连接时显示“启动中”提示框,不友好。
NetSharingManagerClass的Disconnect,Connect方法,可以实现,但有一个问题是,会重新更新IP地址,有明显感觉等。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingMicrosoft.Win32;
usingSystem.Net.NetworkInformation;
usingSystem.Management;
usingSystem.Threading;
usingSystem.Runtime.InteropServices;
usingNETCONLib;
namespaceDynamicMAC
{
publicclassMACHelper
{
[DllImport("wininet.dll")]
privateexternstaticboolInternetGetConnectedState(intDescription,intReservedValue);
///<summary>
///是否能连接上Internet
///</summary>
///<returns></returns>
publicboolIsConnectedToInternet()
{
intDesc=0;
returnInternetGetConnectedState(Desc,0);
}
///<summary>
///获取MAC地址
///</summary>
publicstringGetMACAddress()
{
//得到MAC的注册表键
RegistryKeymacRegistry=Registry.LocalMachine.OpenSubKey("SYSTEM").OpenSubKey("CurrentControlSet").OpenSubKey("Control")
.OpenSubKey("Class").OpenSubKey("{4D36E972-E325-11CE-BFC1-08002bE10318}");
IList<string>list=macRegistry.GetSubKeyNames().ToList();
IPGlobalPropertiescomputerProperties=IPGlobalProperties.GetIPGlobalProperties();
NetworkInterface[]nics=NetworkInterface.GetAllNetworkInterfaces();
varadapter=nics.First(o=>o.Name=="本地连接");
if(adapter==null)
returnnull;
returnstring.Empty;
}
///<summary>
///设置MAC地址
///</summary>
///<paramname="newMac"></param>
publicvoidSetMACAddress(stringnewMac)
{
stringmacAddress;
stringindex=GetAdapterIndex(outmacAddress);
if(index==null)
return;
//得到MAC的注册表键
RegistryKeymacRegistry=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","NetworkAddress");
}
ThreadoThread=newThread(newThreadStart(ReConnect));//newThreadtoReConnect
oThread.Start();
}
///<summary>
///重设MAC地址
///</summary>
publicvoidResetMACAddress()
{
SetMACAddress(string.Empty);
}
///<summary>
///重新连接
///</summary>
privatevoidReConnect()
{
NetSharingManagerClassnetSharingMgr=newNetSharingManagerClass();
INetSharingEveryConnectionCollectionconnections=netSharingMgr.EnumEveryConnection;
foreach(INetConnectionconnectioninconnections)
{
INetConnectionPropsconnProps=netSharingMgr.get_NetConnectionProps(connection);
if(connProps.MediaType==tagNETCON_MEDIATYPE.NCM_LAN)
{
connection.Disconnect();//禁用网络
connection.Connect(); //启用网络
}
}
}
///<summary>
///生成随机MAC地址
///</summary>
///<returns></returns>
publicstringCreateNewMacAddress()
{
//return"0016D3B5C493";
intmin=0;
intmax=16;
Randomro=newRandom();
varsn=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();
returnsn;
}
///<summary>
///得到Mac地址及注册表对应Index
///</summary>
///<paramname="macAddress"></param>
///<returns></returns>
publicstringGetAdapterIndex(outstringmacAddress)
{
ManagementClassoMClass=newManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollectioncolMObj=oMClass.GetInstances();
macAddress=string.Empty;
intindexString=1;
foreach(ManagementObjectobjMOincolMObj)
{
indexString++;
if(objMO["MacAddress"]!=null&&(bool)objMO["IPEnabled"]==true)
{
macAddress=objMO["MacAddress"].ToString().Replace(":","");
break;
}
}
if(macAddress==string.Empty)
returnnull;
else
returnindexString.ToString().PadLeft(4,"0");
}
#regionTemp
publicvoidnoting()
{
//ManagementClassoMClass=newManagementClass("Win32_NetworkAdapterConfiguration");
ManagementClassoMClass=newManagementClass("Win32_NetworkAdapter");
ManagementObjectCollectioncolMObj=oMClass.GetInstances();
foreach(ManagementObjectobjMOincolMObj)
{
if(objMO["MacAddress"]!=null)
{
if(objMO["Name"]!=null)
{
//objMO.InvokeMethod("Reset",null);
objMO.InvokeMethod("Disable",null);//Vistaonly
objMO.InvokeMethod("Enable",null);//Vistaonly
}
//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();
// variObj=objMO.GetMethodParameters("EnableDHCP");
// varoObj=objMO.InvokeMethod("ReleaseDHCPLease",null,null);
// Thread.Sleep(100);
// objMO.InvokeMethod("RenewDHCPLease",null,null);
//}
}
}
}
publicvoidno()
{
Shell32.FoldernetworkConnectionsFolder=GetNetworkConnectionsFolder();
if(networkConnectionsFolder==null)
{
Console.WriteLine("Networkconnectionsfoldernotfound.");
return;
}
Shell32.FolderItem2networkConnection=GetNetworkConnection(networkConnectionsFolder,string.Empty);
if(networkConnection==null)
{
Console.WriteLine("Networkconnectionnotfound.");
return;
}
Shell32.FolderItemVerbverb;
try
{
IsNetworkConnectionEnabled(networkConnection,outverb);
verb.DoIt();
Thread.Sleep(1000);
IsNetworkConnectionEnabled(networkConnection,outverb);
verb.DoIt();
}
catch(ArgumentExceptionex)
{
Console.WriteLine(ex.Message);
}
}
///<summary>
///GetstheNetworkConnectionsfolderinthecontrolpanel.
///</summary>
///<returns>TheFolderfortheNetworkConnectionsfolder,ornullifitwasnotfound.</returns>
staticShell32.FolderGetNetworkConnectionsFolder()
{
Shell32.Shellsh=newShell32.Shell();
Shell32.FoldercontrolPanel=sh.NameSpace(3);//Controlpanel
Shell32.FolderItemsitems=controlPanel.Items();
foreach(Shell32.FolderItemiteminitems)
{
if(item.Name=="网络连接")
return(Shell32.Folder)item.GetFolder;
}
returnnull;
}
///<summary>
///Getsthenetworkconnectionwiththespecifiednamefromthespecifiedshellfolder.
///</summary>
///<paramname="networkConnectionsFolder">TheNetworkConnectionsfolder.</param>
///<paramname="connectionName">Thenameofthenetworkconnection.</param>
///<returns>TheFolderItemforthenetworkconnection,ornullifitwasnotfound.</returns>
staticShell32.FolderItem2GetNetworkConnection(Shell32.FoldernetworkConnectionsFolder,stringconnectionName)
{
Shell32.FolderItemsitems=networkConnectionsFolder.Items();
foreach(Shell32.FolderItem2iteminitems)
{
if(item.Name=="本地连接")
{
returnitem;
}
}
returnnull;
}
///<summary>
///Getswhetherornotthenetworkconnectionisenabledandthecommandtoenable/disableit.
///</summary>
///<paramname="networkConnection">Thenetworkconnectiontocheck.</param>
///<paramname="enableDisableVerb">Onreturn,receivestheverbusedtoenableordisabletheconnection.</param>
///<returns>Trueiftheconnectionisenabled,falseifitisdisabled.</returns>
staticboolIsNetworkConnectionEnabled(Shell32.FolderItem2networkConnection,outShell32.FolderItemVerbenableDisableVerb)
{
Shell32.FolderItemVerbsverbs=networkConnection.Verbs();
foreach(Shell32.FolderItemVerbverbinverbs)
{
if(verb.Name=="启用(&A)")
{
enableDisableVerb=verb;
returnfalse;
}
elseif(verb.Name=="停用(&B)")
{
enableDisableVerb=verb;
returntrue;
}
}
thrownewArgumentException("Noenableordisableverbfound.");
}
#endregion
}
}
相关文章
- C#UDP编程
- C#ftp服务器配置与文件上传
- [C#]Spectre.Console
- C# 字符与字符串操作
- C#用NHibernate实现CRUD详解编程语言
- C#数据结构与算法揭秘三链表
- C#对文件与文件夹的操作包括删除、移动与复制
- C#动态执行字符串(动态创建代码)的实例代码
- C#连接Oracle数据库的实例方法
- C#DataTable转换为实体类对象实例
- 深入分析C#异步编程详解
- C#中如何利用lambda实现委托事件的挂接
- C#中的cookie编程简单实例与说明
- C#计算两个文件的相对目录算法的实例代码
- c#只读字段和常量的区别,以及静态构造函数的使用实例
- c#根据文件大小显示文件复制进度条实例
- c#异常处理示例分享
- C#使用PHP服务端的WebService通信实例
- C#数据库操作类AccessHelper实例
- C#实现的简单验证码识别实例
- C#关于类的只读只写属性实例分析
- C#生成随机数实例
- C#实现调用迅雷下载的方法
- C#中类与结构的区别实例分析
- C#基础之Lambda表达式用法实例教程
- 基于C#实现的多生产者多消费者同步问题实例
- C#控制台程序中处理2个关闭事件的代码实例