13/06/2017

Hướng dẫn tạo Batch script thay đổi địa chỉ MAC của bộ điều hợp mạng


Với việc tạo tập tin batch sử dụng để thay đổi địa chỉ MAC của bộ điều hợp mạng bạn không còn phải sử dụng phần mềm hay thay đổi thủ công. Khi cần thay đổi chỉ cần chạy tập tin batch chọn thay đổi đại chỉ MAC hoặc bạn cũng có thể đặt lại địa chỉ MAC về mặc định rất đơn giản. Các bước thực hiện như sau:

Bước 1: Mở trình soạn thảo Notepad copy đoạn code bên dưới vào.

Batch-script

:: Name     : Change MAC Address using Batch Files
:: Author   : Nguyen Tuan.
:: Website  : www.blogthuthuatwin10.com
:: --------------------------------------------------------------------------
chcp 65001 >nul
@echo off
title Change MAC Address
mode con: cols=120 lines=32
color 3f
chcp 65001 >nul
cd /d %~dp0
cls
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if "%errorlevel%" NEQ "0" (
echo: Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo: UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" & exit
)
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
:: --------------------------------------------------------------------------
:: --------------------------------------------------------------------------
:main
setlocal enabledelayedexpansion
call :get-interfaces-info iset iinfo ireg
if "%1"=="list" (
call :cmdline-list-adapters iset iinfo
goto :eof
)
if "%1"=="" (
call :main-menu iset iinfo
pause
goto :eof
)

if "%1"=="change" (
call :cmdline-change-mac-address iinfo "%~2"  "%~3"
goto :eof
)

if "%1"=="reset" (
call :cmdline-reset-mac-address iinfo "%~2"
goto :eof
)

if "%1"=="__internal" (
goto internal-dispatch
goto :eof

:: --------------------------------------------------------------------------
:cmdline-reset-mac-address <1=iinfo> <2=adapater> <3=new mac>
echo.Đang đặt lại "%~2"'s địa chỉ MAC về mặc định.
call :reset-mac-address "%~1" "%~2"
goto :eof

:: --------------------------------------------------------------------------
:cmdline-change-mac-address <1=iinfo> <2=adapater> <3=new mac>
set __t=%~3
set __t=%__t:-=%
echo.Đang thay đổi "%~2"'s địa chỉ MAC sang "%~3"
call :change-mac-address "%~1" "%~2" "%__t%"
goto :eof

:: --------------------------------------------------------------------------
:cmdline-list-adapters <1=iset> <2=iinfo>
echo.
echo.Danh sách tên bộ điều hợp mạng:
echo.-------------------------------
for /f "tokens=2 delims=.=" %%a in ('set %~1.') do (
set __t=!%~2[%%a].mac!
echo Địa chỉ MAC: [!__t!] ^| Tên bộ điều hợp mạng: %%a
)

goto :eof

:: --------------------------------------------------------------------------
:main-menu <1=iset> <2=iinfo>
:main-menu-repeat
cls
echo.Đổi địa chỉ MAC
echo.
echo.ID Bộ điều hợp mạng
echo.
set __choices=Q
for /f "tokens=2 delims=.=" %%a in ('set %~1.') do (
call set __num=%%%~2[%%a].index%%
set __choices=!__choices!!__num!
set __c2i[!__num!]=%%a
echo !__num!^ %%a
)
echo.Q^ Thoát
echo.
set /p="Chọn bộ điều hợp mạng để tiếp tục:" <nul
choice /C:%__choices% >nul
set /a __num=%errorlevel%-1
if %__num%==0 (
call :close
)
set adapter=!__c2i[%__num%]!
call :adapter-menu "%~2" "%adapter%"
goto main-menu-repeat

:: --------------------------------------------------------------------------
:adapter-menu <1=iinfo> <2=adapter>
cls
call set __CurMac=%%%~1[%~2].mac%%
echo.Thông tin bộ điều hợp mạng:
echo.--------------------------
echo.
echo Bộ điều hợp mạng: %~2
call echo.Tên bộ điều hợp mạng: %%%~1[%~2].adapter%%
echo.Địa chỉ MAC: %__CurMac%
call echo.Trạng thái kết nối: %%%~1[%~2].state%%
echo.
echo.Chọn hành động:
echo.--------------------------
echo.
echo.C Đổi địa chỉ MAC
echo.R Đặt lại địa chỉ MAC
echo.B Về Menu chính
echo.
set /p="Lựa chọn của bạn là:" <nul
choice /C:"BCR" >nul
set __option=%errorlevel%

:: Go back to main menu
if %__option%==1 (
exit /b 0
)
if %__option%==2 (
call :prompt-new-mac-address !__CurMac! __NewMac
if !errorlevel!==0 (
goto :eof
)
echo.Đang đổi địa chỉ MAC sang !__NewMac!
call :change-mac-address iinfo "%~2" !__NewMac!
set /p="Địa chỉ MAC đã được đổi thành công!. Gõ bất kỳ phím nào để quay về Menu chính..."<nul
pause >nul
)
if %__option%==3 (
echo.
choice /C:YN /M "Bạn có muốn đặt lại địa chỉ MAC về mặc định "
if !errorlevel!==2 (
goto :eof
)
echo.Đang đặt lại địa chỉ MAC...
call :reset-mac-address iinfo "%~2"
set /p="Địa chỉ MAC đã được đặt lại thành công!. Gõ bất kỳ phím nào để quay về Menu chính..."<nul
pause >nul
)
goto :eof

:: --------------------------------------------------------------------------
:prompt-new-mac-address <1=curmac> <2=newmac> => errorlevel(0=cancel, 1=ok)
cls
echo.Chuẩn định dạng (IEEE 802) bao gồm sáu nhóm, mỗi nhóm gồm 2 số hoặc chữ.
echo.Mỗi nhóm hai chữ số được cách nhau bằng dấu gạch ngang (-).
echo.Để đơn giản bạn chỉ cần đổi từ 1 đến 2 chữ số trong sáu nhóm của địa chỉ
echo.MAC cũ và giữ nguyên 2 chữ số đầu.
echo.

:prompt-new-mac-address-repeat
echo.Địa chỉ MAC cũ: %~1
set /p __NewMAC="Nhập địa chỉ MAC mới: "
choice /C:YN /M "Bạn có chắc chắn thay đổi địa chỉ MAC "
if %errorlevel%==2 (
exit /b 0
)
set __NewMAC=%__NewMAC:-=%
if ".%__NewMAC:~11,1%" EQU "." (
echo.
echo.Địa chỉ MAC quá ngắn
echo.
goto prompt-new-mac-address-repeat
)
if ".%__NewMAC:~12,1%" NEQ "." (
echo.
echo.Địa chỉ MAC quá dài
echo.
goto prompt-new-mac-address-repeat
)

:: Update caller's value
set %~2=%__NewMAC%

set __t=%~1
set __t=%__t:-=%
if "%__NewMAC%"=="%__t%" (
exit /b 0
)
exit /b 1

:: --------------------------------------------------------------------------
:reset-mac-address <1=iinfo> <2=adapter>
set __t=!%~1[%~2].reg!
reg delete "%__t%" /F /V NetworkAddress >nul 2>&1
call :refresh-interface "%~1" "%~2"
goto :eof

:: --------------------------------------------------------------------------
:change-mac-address <1=iinfo> <2=adapter> <3=NewMac>
set __t=!%~1[%~2].reg!
reg add "%__t%" /F /V NetworkAddress /T REG_SZ /D %~3 >nul 2>&1
call :refresh-interface "%~1" "%~2"
goto :eof

:: --------------------------------------------------------------------------
:refresh-interface <1=iinfo> <2=adapter>
netsh interface set interface "%~2" disable
netsh interface set interface "%~2" enable
call set __t=%%%~1.name%%
call :get-interfaces-info "%__t%" "%~1" ireg
goto :eof

:: --------------------------------------------------------------------------
:get-interfaces-info <1=set-name> <2=iinfo> <3=ireg>
set %~2.name=%~1
call :get-interfaces-ipconfig-info "%~2" "%~1"
call :get-interfaces-reg-keys "%~3"
set /a __num=1
for /f "tokens=2 delims=.=" %%a in ('set iset.') do (
set __t=!iinfo[%%a].adapter!
set __v=%~3[!__t!]
call set __t=%%!__v!%%
set %~2[%%a].reg=!__t!
set %~2[%%a].index=!__num!
set /a __num+=1
)
goto :eof

:: --------------------------------------------------------------------------
:get-interfaces-reg-keys <1=arr>
call :get-interfaces-reg-keys-ex "%~1" "DriverDesc" 6 "Driver"
call :get-interfaces-reg-keys-ex "%~1" "AdapterModel" 7 "Adapter"
goto :eof

:: --------------------------------------------------------------------------
:get-interfaces-reg-keys-ex <1=arr> <2=KeyName> <3=MatchLen> <4=MatchVal>
for /f "tokens=*" %%a in (
'reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}" /v "%~2" /s 2^>nul'
) do (
set __t=%%a
if "!__t:~0,10!"=="HKEY_LOCAL" (
set __regkey=%%a
)
if "!__t:~0,%3!"=="%~4" (
for /f "tokens=2*" %%b in ("%%a") do (
set %~1[%%c]=!__regkey!
)
)
)
set __regkey=
set __t=
goto :eof

:: --------------------------------------------------------------------------
:get-interfaces-ipconfig-info <1=arr> <2=interfaces-set>
:: Return interface friendly names
call :get-interfaces-netsh-info %~1

:: For each interface, return the physical address and the adapter name
for /f "tokens=1,2 delims=][" %%a in ('set %~1[') do (
call :get-interface-info %~1 "%%b"
set %~2.%%b=1
)
exit /b 0

:: --------------------------------------------------------------------------
:get-interface-info <1=arr> <2=name>
set /a __stage=0
for /f "tokens=*" %%a in ('ipconfig /all') do (
set __var=%%a
if !__stage! equ 0 (
set __t=!__var:*adapter %~2:=!
if "!__t!" NEQ "!__var!" (
set /a __stage=1
)
)
if !__stage! EQU 1 (
set __t=!__var:Description . . . . . . . . . . . : =!
if "!__t!" NEQ "!__var!" (
set %~1[%~2].adapter=!__t!
set /a __stage+=1
)
)
if !__stage! EQU 2 (
set __t=!__var:Physical Address. . . . . . . . . : =!
if "!__t!" NEQ "!__var!" (
set %~1[%~2].mac=!__t!
set /a __stage+=1
)
)
)
:: Clear work variables
set __stage=
set __var=
set __t=
goto :eof

:: --------------------------------------------------------------------------
:get-interfaces-netsh-info <1=arr>
FOR /F "tokens=2,3*" %%a in ('netsh interface show interface') do (
if /i "%%a" neq "State" (
set %1[%%c].state=%%a
)
)
exit /b 0

:: --------------------------------------------------------------------------
:internal-dispatch
shift
set __t=%1
shift
goto %__t%

:: --------------------------------------------------------------------------
:tests
call :test-get-interfaces-ipconfig-info
call :test-get-interfaces-reg-keys
call :test-get-interfaces-info
goto :eof

:: --------------------------------------------------------------------------
:test-prompt-new-mac-address
call :prompt-new-mac-address 11-22-33-44-55-66 newmac
echo.Kết quả: %errorlevel% ; newmac = %newmac%
goto :eof

:: --------------------------------------------------------------------------
:test-get-interfaces-info
call :get-interfaces-info iset iinfo ireg
echo ----------------------------
echo All interfactes information:
echo ----------------------------
set iinfo[
goto :eof

:: --------------------------------------------------------------------------
:test-get-interfaces-reg-keys
call :get-interfaces-reg-keys ireg
echo Interfaces registry keys map:
echo -----------------------------
set ireg[
goto :eof

:: --------------------------------------------------------------------------
:test-get-interfaces-ipconfig-info
call :get-interfaces-ipconfig-info iinfo ifaces
echo Interfaces information:
echo -----------------------
set iinfo[
echo.
echo All interfaces:
echo ---------------
set ifaces.
goto :eof

:: --------------------------------------------------------------------------
:close
cls
echo.Chương trình sẽ tự động tắt sau 15 giây.
echo.Cảm ơn bạn đã sử dụng chương trình.
echo.Tạm biệt và hẹn gặp lại.
timeout /t 15 /nobreak
exit
:: ------------------------------------------------------------------------------------

::End

Bước 2: Lưu lại với tên ví dụ MACAddressChanger.cmd hoặc MACAddressChanger.bat định dạng All files và Encoding: UTF-8

Bước 3: Chạy tập tin batch vừa tạo. Một vài hình ảnh minh họa.






0 nhận xét