zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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
   }
}