-
C#教程之C#修改MAC地址类的实例
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
}
}
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式