MAC(媒体访问控制)地址是网络设备的唯一标识符,用于网络通信。MAC 地址通常在设备制造时被分配并写入硬件。然而,在某些情况下,你可能需要或想要更改设备的 MAC 地址。以下是一些可能的理由:

1. **隐私和安全**:当你的设备连接到网络时,MAC 地址通常会被路由器和其他网络设备记录下来。这可能允许网络管理员,ISP,或者潜在的攻击者跟踪你的设备。通过定期更改你的 MAC 地址,你可以在一定程度上保护你的隐私和安全。

2. **网络访问控制**:一些网络,特别是企业网络,可能会使用 MAC 地址过滤作为访问控制的一部分。在这些情况下,只有预先允许的 MAC 地址才能连接到网络。如果你需要连接到这样的网络,但你的设备的 MAC 地址没有被允许,你可以更改你的 MAC 地址为一个已经被允许的地址。

3. **软件许可**:有些软件使用 MAC 地址作为许可证检查的一部分。如果你需要在新的硬件上运行这样的软件,但不想或不能获取新的许可证,你可以将新硬件的 MAC 地址更改为旧硬件的 MAC 地址。

请注意,虽然更改 MAC 地址在某些情况下可能有用,但也可能有潜在的问题。例如,如果两个设备在同一网络上使用了相同的 MAC 地址,可能会导致网络冲突。此外,不适当地更改 MAC 地址可能会导致网络连接问题。

批处理脚本

但是常规的修改MAC的方式比较繁琐,下面我为大家介绍一个通过批处理脚本的方式,在两个MAC地址值之间进行切换的方法,脚本如下

@echo off

chcp 65001

setlocal enabledelayedexpansion

:: 设定两个MAC地址
set MAC1=00-7B-57-45-DE-01
set MAC2=08-00-04-27-43-02

echo MAC1 is set to %MAC1%
echo MAC2 is set to %MAC2%

:: 打印 getmac 命令的输出
echo Running 'getmac /v /fo list' command:
getmac /v /fo list
echo.

:: 初始化 Found 变量
set Found=false

for /f "tokens=1-2 delims=:" %%a in ('getmac /v /fo list') do (
    if "%%a"=="Connection Name" if "%%b"=="  ethernet" (
    set Found=true
    echo found the right connection name
    for /f "tokens=1-2 delims=:" %%c in ('getmac /v /fo list') do (
            if "!Found!"=="true" if "%%c"=="Physical Address" (
                set CurrentMAC=%%d
                set Found=false
            )
        )
    ) 
)
echo The MAC address of the "以太网" interface is: %CurrentMAC%

:: 删除前导空格
set CurrentMAC=!CurrentMAC:~1!
echo "%CurrentMAC%"
echo "%MAC1%"

if /I "%CurrentMAC%"=="%MAC1%" (
    echo Switching from MAC1 to MAC2...
    set MAC2=!MAC2:-=!
    echo "!MAC2!"
    netsh interface set interface "ethernet" admin=disable
    REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0001" /v NetworkAddress /t REG_SZ /d !MAC2! /f
    netsh interface set interface "ethernet" admin=enable
) else (
    echo Switching from %CurrentMAC% to MAC1...
    set MAC1=!MAC1:-=!
    echo "!MAC1!"
    netsh interface set interface "ethernet" admin=disable
    REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0001" /v NetworkAddress /t REG_SZ /d !MAC1! /f
    netsh interface set interface "ethernet" admin=enable
)



endlocal

pause

使用方法

设置MAC地址值

:: 设定两个MAC地址
set MAC1=00-7B-57-45-DE-01
set MAC2=08-00-04-27-43-02

在上面两行中设置切换的两个MAC地址值

确定要改MAC的以太网接口名称

以windows 11为例,查看?“网络连接”,如下图所示,我的电脑的以太网接口名称为“ethernet”

切换以太网接口MAC地址的批处理脚本-LMLPHP

脚本中,如下行也是打印出电脑中的网络连接列表,从列表中也可查看到你的以太网接口名称

:: 打印 getmac 命令的输出
echo Running 'getmac /v /fo list' command:
getmac /v /fo list
echo.

 

 在脚本中修改成你的以太网接口名称

切换以太网接口MAC地址的批处理脚本-LMLPHP

 注意此处引号内的名称之前要加两个“空格”,这是因为列表形式冒号后有两个空格

Connnection Name:  ethernet

如下,在引号内修改成你的以太网接口名称 (这里不用在前面加空格)

切换以太网接口MAC地址的批处理脚本-LMLPHP

 如果不想在脚本中修改名称,那么也可以通过在“网络连接”中将以太网连接重命名为“ethernet”

切换以太网接口MAC地址的批处理脚本-LMLPHP

 注意:使用此脚本时,需要在管理员模式下运行!

脚本逐行解释

注意:这个脚本需要管理员权限才能运行,并且可能需要你根据实际情况修改网络适配器的注册表路径。在这个示例中,路径为HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0001,但是在你的计算机上可能会有所不同。

下面是逐行解释:

1. `@echo off`:关闭回显,不显示执行的命令。
2. `chcp 65001`:设置命令行为 UTF-8 编码,以避免乱码。
3. `setlocal enabledelayedexpansion`:开启延迟变量扩展,允许在代码块(如 for 循环)中更新和使用变量。
4-6. `:: 设定两个MAC地址`:注释,说明下面两行设置了两个 MAC 地址。
7. `set MAC1=84-7B-57-45-DE-4F`:设置第一个 MAC 地址。
8. `set MAC2=08-92-04-27-43-8C`:设置第二个 MAC 地址。
9-10. `echo MAC1 is set to %MAC1%` 和 `echo MAC2 is set to %MAC2%`:打印两个 MAC 地址的值。
11-14. `echo Running 'getmac /v /fo list' command:` 和 `getmac /v /fo list`:显示当前运行的命令并打印 getmac 命令的输出。
15. `set Found=false`:初始化 Found 变量为 false。
16-31. `for /f ...`:for 循环用于查找名为 "以太网" 的连接的当前 MAC 地址。
   - 18-19. `if "%%a"=="Connection Name" if "%%b"=="  ethernet"`:如果找到名为 "以太网" 的连接,将 Found 设置为 true。
   - 22-27. `if "!Found!"=="true" if "%%c"=="Physical Address"`:如果找到 "以太网" 连接并且当前行包含 "Physical Address",则将当前 MAC 地址设置为 %%d 的值并将 Found 设置为 false。
32. `echo The MAC address of the "以太网" interface is: %CurrentMAC%`:打印当前的 MAC 地址。
33-34. `set CurrentMAC=!CurrentMAC:~1!`:删除 CurrentMAC 值的前导空格。
35-36. `echo "%CurrentMAC%"` 和 `echo "%MAC1%"`:打印当前的 MAC 地址和第一个 MAC 地址。
37-47. `if /I "%CurrentMAC%"=="%MAC1%" ...`:如果当前的 MAC 地址等于第一个 MAC 地址,执行以下操作:
   - 禁用 "ethernet" 接口。
   - 更新注册表以设置新的 MAC 地址。
   - 启用 "ethernet" 接口。
48-58. `else ...`:如果当前的 MAC 地址不等于第一个 MAC 地址,执行以下操作:
   - 禁用 "ethernet" 接口。
   - 更新注册表以设置新的 MAC 地址。
   - 启用 "ethernet" 接口。
59. `endlocal`:结束局部变量

总结:

通过这个脚本,我们可以实现在两个MAC地址间进行更换,用户也可以通过修改脚本,达到其他修改MAC的逻辑,如在一串MAC地址列表中,进行循环更换,每次更换为下一个MAC。

05-14 03:28