(1)第一步寻找适配器MAC所在的注册表位置
在注册表"SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}"目录下遍历寻找
你要修改的哪个网卡的名称(在设备管理器>网络适配器中有网卡名称的列表),
比如实验机网卡名称:Realtek PCIe GBE Family Controller,这个值保存在对应网卡的注册表项的DriverDesc键值中,则同注册表项
中的NetworkAddress值就是我们要找并修改的MAC值。
(2)重启网卡也采用命令行方式:
netsh interface set interface "连接名称" DISABLE //使网卡失效
netsh interface set interface "连接名称" ENABLE //启动网卡
(3)用命令行方式修改
system("命令");但这种方式执行指令的时候会弹出console窗口
采用ShellExcuteEx,可以创建一个新的进程去执行修改命令,并且在程序中适用WaitForSingleObject等待进程结束。
如果直接在按钮按下响应消息中执行命令,命令执行期间窗口将假死(因为消息循环因命令执行而阻塞);通过创建新的线程去进行修改操作,并在线程执行结束后,发送一个自定义消息WM_MSG_MODIFY_COMPLETE(表示命令执行结束)。
//启动cmd执行 netsh命令,并等待命令结束
void CIpChangeDlg::ExcuteCommand(char* pCommandParam)
{
//初始化shellexe信息
SHELLEXECUTEINFO ExeInfo;
ZeroMemory(&ExeInfo, sizeof(SHELLEXECUTEINFO));
ExeInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ExeInfo.lpFile = "cmd.exe";
ExeInfo.lpParameters = pCommandParam;
ExeInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ExeInfo.nShow = SW_HIDE;
ExeInfo.hwnd = NULL;
ExeInfo.lpVerb = NULL;
ExeInfo.lpDirectory = NULL;
ExeInfo.hInstApp = NULL;
//执行命令
ShellExecuteEx(&ExeInfo);
//等待进程结束
WaitForSingleObject(ExeInfo.hProcess, INFINITE);
}
在注册表"SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}"目录下遍历寻找
你要修改的哪个网卡的名称(在设备管理器>网络适配器中有网卡名称的列表),
比如实验机网卡名称:Realtek PCIe GBE Family Controller,这个值保存在对应网卡的注册表项的DriverDesc键值中,则同注册表项
中的NetworkAddress值就是我们要找并修改的MAC值。
(2)重启网卡也采用命令行方式:
netsh interface set interface "连接名称" DISABLE //使网卡失效
netsh interface set interface "连接名称" ENABLE //启动网卡
(3)用命令行方式修改
system("命令");但这种方式执行指令的时候会弹出console窗口
采用ShellExcuteEx,可以创建一个新的进程去执行修改命令,并且在程序中适用WaitForSingleObject等待进程结束。
如果直接在按钮按下响应消息中执行命令,命令执行期间窗口将假死(因为消息循环因命令执行而阻塞);通过创建新的线程去进行修改操作,并在线程执行结束后,发送一个自定义消息WM_MSG_MODIFY_COMPLETE(表示命令执行结束)。
//启动cmd执行 netsh命令,并等待命令结束
void CIpChangeDlg::ExcuteCommand(char* pCommandParam)
{
//初始化shellexe信息
SHELLEXECUTEINFO ExeInfo;
ZeroMemory(&ExeInfo, sizeof(SHELLEXECUTEINFO));
ExeInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ExeInfo.lpFile = "cmd.exe";
ExeInfo.lpParameters = pCommandParam;
ExeInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ExeInfo.nShow = SW_HIDE;
ExeInfo.hwnd = NULL;
ExeInfo.lpVerb = NULL;
ExeInfo.lpDirectory = NULL;
ExeInfo.hInstApp = NULL;
//执行命令
ShellExecuteEx(&ExeInfo);
//等待进程结束
WaitForSingleObject(ExeInfo.hProcess, INFINITE);
}