Board logo

标题: [原创]我自己写的网管工具,欢迎批评指正. [打印本页]

作者: tghksj     时间: 2006-12-7 04:28    标题: [原创]我自己写的网管工具,欢迎批评指正.

我是最近几天来这里的 ,正好看见有朋友问如何通过识别MAC进行简单网络设置.

这几天在论坛上看到几为我现在难望其项背的高人,

现在还开贴贴出这段代码只为学习,希望大家批评指正.

代码是我在来之前就已经写好的,里面的地址是我的PHP论坛,只做我个人笔记和

方便几位要好朋友联系之用的,绝对排除做广告嫌疑!非联系本人请不要访问.

更新了一下,加入了时间同步
本来想写组合参数功能,由于今天时间有限没有写完就不写了.
争取下一版实现组合参数.
对于斑竹提出的关于工作组/域的操作只能在NT SERVER域控制器中实现
XP系统到现在为止我还没有找到相关命令行操作...(有知道的兄弟赐教一下.谢谢)

:::------------------------------------------------------------------------
::::::::20061206版
::::::::本次更新修正了更改计算机名不完全的BUG。
::::::::加入了同步服务器时间功能 /t 。
:::::::::::::::::::::::::::::::::::::::::::::::::::::CONFIG.txt::::::示例::::::::↓
::::%%I                    %%j                  %%k             %%l                %%m             %%n             %%o
::::MAC                    COMPUTERNAME         IP              MASK               GATEWAY         DNS1            DNS2
::::00-E0-4C-49-XX-XX      t21                  222.173.XX.XX   255.255.XXX.XXX    222.173.XX.XX   219.146.X.XXX   219.150.XX.XXX
:::::::::::::::::::::::::::::::::::::::::::::::::::::CONFIG.txt::::::示例::::::::↑


@ECHO %dbg% OFF
CLS
ECHO "TGHKSJ.CMD" 版本20061206(以日期为版本号) 作者:tghksj 地址:http://w.vicp.net

setlocal

:VERSION
ver | find /i "Windows XP" > nul
IF NOT errorlevel 1 GOTO :START
ECHO.
ECHO.
ECHO 此程序只在Windows XP操作系统下测试通过.
ECHO 其他版本不能保证正常运行.
GOTO :QUIT

:START
IF NOT "%~1"=="%*"     GOTO :SYNTAX
IF /I "%~1"=="/l"      GOTO :LIST
IF /I "%~1"=="/s"      GOTO :SET
IF /I "%~1"=="/t"      GOTO :TTIME
                       GOTO :HELP


:SYNTAX
echo.
echo.
echo  !!参数错误!!
echo  ________________
echo  不带参数直接运行本程序将显示帮助信息,并按提示操作.
echo.
GOTO :HELP

::::::::::获取MAC IP NAME并保存::::::::::::::::::::::::::::::::::::::::::::::::::↓
:LIST
Find "%COMPUTERNAME%" "%~dp0"CONFIG.txt > NUL
IF %errorlevel% == 0  GOTO :HAVELIST
FOR /F "usebackq eol=; tokens=2 delims=:" %%I in (`ipconfig /all^|find /i "Physical Address"`) do set MAC=%%I
FOR /F "usebackq eol=; tokens=2 delims=:" %%I in (`ipconfig /all^|find /i "IP Address"`) do set IP=%%I
FOR /F "usebackq eol=; tokens=2 delims=:" %%I in (`ipconfig /all^|find /i "Subnet Mask"`) do set MASK=%%I
FOR /F "usebackq eol=; tokens=2 delims=:" %%I in (`ipconfig /all^|find /i "Default Gateway"`) do set GATEWAY=%%I
FOR /F "usebackq eol=; tokens=2 delims=:" %%I in (`ipconfig /all^|find /i "DNS Servers"`) do set DNS1=%%I
FOR /F "skip=19 tokens=1 usebackq"  %%I in (`ipconfig /all`) do set DNS2=%%I
ECHO %MAC% %COMPUTERNAME% %IP% %MASK% %GATEWAY% %DNS1%  %DNS2%>>"%~dp0"CONFIG.txt
IF /I "%~1"=="/l" EXIT
ECHO 信息收集完毕并保存到 %~dp0CONFIG.txt
GOTO :QUIT
::::::::::获取MAC IP NAME并保存::::::::::::::::::::::::::::::::::::::::::::::::::↑

::::::::::识别MAC,并据此进行设置:::::::::::::::::::::::::::::::::::::::::::::::::↓
:SET
FOR /F "usebackq eol=; tokens=2 delims=:" %%I in (`ipconfig /all^|find /i "Physical Address"`) do set MAC=%%I
find /i "%MAC%" "%~dp0CONFIG.txt" > nul
IF %errorlevel% == 1  GOTO :NO_LIST
FOR /F "tokens=2,3,4,5,6,7" %%j in ('find /i "%MAC%" "%~dp0CONFIG.txt"') do (
                                                   SET TCOMPUTERNAME=%%j
                                                   SET IP=%%k
                                                   SET MASK=%%l
                                                   SET GATEWAY=%%m
                                                   SET DNS1=%%n
                                                   SET DNS2=%%o
                                                                             )
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName /v "ComputerName" /t REG_SZ /d %TCOMPUTERNAME% /f
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName /v "ComputerName" /t REG_SZ /d %TCOMPUTERNAME% /f
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v "Hostname"    /t REG_SZ /d %TCOMPUTERNAME% /f
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v "NV Hostname" /t REG_SZ /d %TCOMPUTERNAME% /f
netsh interface ip set address name="本地连接" source=static addr=%IP% mask=%MASK% gateway=%GATEWAY% gwmetric=0
netsh interface ip set dns name="本地连接" source=static addr=%DNS1% register=PRIMARY
netsh interface ip add dns name="本地连接" addr=%DNS2%
IF /I "%~1"=="/s"  GOTO :SHUT_Y
echo.
echo  提示:
echo  信息设置完毕.建议按"R"重新启动.(推荐!)
GOTO :SHUT_W
::::::::::识别MAC,并据此进行设置:::::::::::::::::::::::::::::::::::::::::::::::::↑

::::::::::同步服务器时间:::::::::::::::::::::::::::::::::::::::::::::::::::::::::↓
:TTIME
FOR /f "tokens=1 delims=\" %%i in ("%~dp0") do NET TIME \\%%i /SET /Y
IF /I "%~1"=="/t" EXIT
ECHO 时间同步为: %date% %time%
GOTO :QUIT
::::::::::同步服务器时间:::::::::::::::::::::::::::::::::::::::::::::::::::::::::↑

:::::::::::::::::::::::重新启动计算机::::::::::::::::::::::::::::::::::::::::::::↓
:SHUT_Y
shutdown -r -t 0
EXIT

:SHUT_W
echo  -------------------------------
set /P CHS= [  按"R"键重新启动    按"Q"键退出程序  按"H"键返回帮助  ]?
if /I "%CHS%"=="R" GOTO :SHUT_Y
if /I "%CHS%"=="Q" GOTO :QUIT
if /I "%CHS%"=="H" GOTO :HELP
CLS
GOTO :SHUT_W
:::::::::::::::::::::::重新启动计算机::::::::::::::::::::::::::::::::::::::::::::↑


:::::::::::::::::::::::帮助信息和手动选择::::::::::::::::::::::::::::::::::::::::↓
:HELP
echo.
echo                                 -= 帮助 =-
echo ------------------------------------------------------------------
echo.
echo  可用参数:
echo.
echo    /help   显示此帮助信息.
echo    /l      收集客户端信息.信息包括MAC地址、计算机名、IP、子网掩码、网关、DNS。
echo    /s      自动设置客户机MAC地址、计算机名、IP、子网掩码、网关、DNS。
echo    /t      同步本文件所在服务器时间.
echo.
echo  使用方法:   
echo    任选一台主机为服务器,服务器任意路径新
echo    建任意名文件夹设置"完全共享",存放此程序.
echo  收集信息时客户机执行:
echo     \\服务器名\本程序所在文件夹共享名\TGHKSJ.CMD /l
echo  更改客户端时客户机执行:
echo     \\服务器名\本程序所在文件夹共享名\TGHKSJ.CMD /s
echo  同步服务器时间时客户机执行:
echo     \\服务器名\本程序所在文件夹共享名\TGHKSJ.CMD /t
echo  或者手动执行此程序,按提示操作。
echo.
echo  -----------------------------------------------------------------
set /P CHS= [  按"L"键收集信息    按"S"键设置信息   按"T"键同步时间   按"Q"键退出程序  ]?
if /I "%CHS%"=="L" GOTO :LIST
if /I "%CHS%"=="S" GOTO :SET
if /I "%CHS%"=="T" GOTO :TTIME
if /I "%CHS%"=="Q" GOTO :QUIT
CLS
GOTO :HELP
:::::::::::::::::::::::帮助信息和手动选择::::::::::::::::::::::::::::::::::::::::↑

:::::::::::::::::::::::重复收集提示::::::::::::::::::::::::::::::::::::::::::::::↓
:HAVELIST
IF /I "%~1"=="/l" EXIT
ECHO.
ECHO.
ECHO.
ECHO 提示:
ECHO 本机信息先前已经收集过.
ECHO.
GOTO :QUIT
:::::::::::::::::::::::重复收集提示::::::::::::::::::::::::::::::::::::::::::::::↑

:::::::::::::::::::::::无信息记录提示::::::::::::::::::::::::::::::::::::::::::::↓
:NO_LIST
IF /I "%~1"=="/S" EXIT
ECHO.
ECHO.
ECHO.
ECHO 提示:
ECHO 没有找到本机信息记录
ECHO 请检查%~dp0CONFIG.txt.
ECHO.
GOTO :HELP
:::::::::::::::::::::::无信息记录提示::::::::::::::::::::::::::::::::::::::::::::↑

:::::::::::::::::::::::提示退出::::::::::::::::::::::::::::::::::::::::::::::::::↓
:QUIT
echo            ________________________________________________________
echo.
echo                              http://w.vicp.net
echo            ________________________________________________________
echo                                [按任意键退出]
echo             ------------------------------------------------------
echo.
if /I "%1"=="" pause>NUL
:::::::::::::::::::::::提示退出::::::::::::::::::::::::::::::::::::::::::::::::::↑

[ Last edited by tghksj on 2006-12-7 at 03:52 PM ]
作者: tghksj     时间: 2006-12-7 05:19
刚才巧遇到
:::::
@echo off
:: 代码编写:3742668 代码修订:namejm www.cn-dos.net

::调用格式:
call :select "ip address" "ip"
call :select "Physical Address" "mac"
call :select "Default Gateway" "gateway"
call :select "DNS Servers" "dns"
call :select "Description" "netcard"

:: 演示效果
echo IP:%ip%
echo MAC:%mac%
echo DNS:%dns%
echo GATEWAY:%gateway%
echo NETCARD:%netcard%
pause>nul
goto :eof

::**************************************************************
::              解析ipconfig命令输出通用函数
::**************************************************************
:select
    for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| findstr /i /c:%1') do if not "!%~2!" == "" set "%~2=%%i"
goto :eof
::::::
可以对上面的获取段进行简化,可是DNS2有什么比较好的获取方式吗?排除我的算行方式.

-------------------------------------
越看越直冒冷汗.......()计算机名漏掉了一个项
reg add "HKLM\System\CurrentControlSet\Control\ComputerName\ActiveComputerName" /v ComputerName /t reg_sz /d %TCOMPUTERNAME% /f
reg add "HKLM\System\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t reg_sz /d %TCOMPUTERNAME% /f
reg add "HKLM\System\CurrentControlSet\Services\Tcpip\Parameters" /v Hostname /t reg_sz /d %TCOMPUTERNAME% /f
--------
工作组也没有...
net config workstation

[ Last edited by tghksj on 2006-12-6 at 04:39 PM ]
作者: ccwan     时间: 2006-12-7 05:38
感觉不错了,偶等你更新^)^
作者: 3742668     时间: 2006-12-7 12:50
Re tghksj:
原贴中为了保证表格的美化,所以只获得一个网络连接的设置,如果当前计算机中有多个连接的话可以在前面加上setlocal enabledelayedexpansion,然后在:select中的for语句中把if语句更换为set "%~2=%%i !%~2!"。
至于获得2个dns,方法多种多样,再给个netsh版的吧:
for /f "skip=3 delims== tokens=1,2" %i in ('netsh diag show dns 1') do @if "%j" == "" (@echo %i) else (@echo %j)
命令行中测试通过。
另外: 请教,批处理下如何读取和修改本机计算机名和工作组?
作者: tghksj     时间: 2006-12-7 23:59
re 3742668

计算机名的读取可以用原有变量%COMPUTERNAME%
而修改时只能通过改写注册表的方式进行.
在1楼包含变量%TCOMPUTERNAME%句中即是相关处理手段,之所以有这个变量名是防止与原常设变量%COMPUTERNAME%冲突.

而对于工作组的相关处理,到现在我还未找到有相关命令或方法进行更改.
只知道工作组的获取方式为 net config workstation
作者: vkill     时间: 2006-12-8 05:43
呵呵,这些p很实用的哈
作者: 3742668     时间: 2006-12-8 12:37


  Quote:
对于斑竹提出的关于工作组/域的操作只能在NT SERVER域控制器中实现

测试平台:xp sp2专业版
网络环境:家庭用户ADSL
根据我的试验,在非精简版的xp专业版中是可以利用wmic来更改工作组等参数的。
建议多研究研究wmic /?.
作者: tghksj     时间: 2006-12-9 01:15


  Quote:
Originally posted by 3742668 at 2006-12-7 11:37 PM:

测试平台:xp sp2专业版
网络环境:家庭用户ADSL
根据我的试验,在非精简版的xp专业版中是可以利用wmic来更改工作组等参数的。
建议多研究研究wmic /?.

麻烦斑竹发一份WMIC下的操作步骤.学习一下.谢谢!
作者: 3742668     时间: 2006-12-10 02:40


  Quote:
Originally posted by tghksj at 2006-12-9 01:15:



麻烦斑竹发一份WMIC下的操作步骤.学习一下.谢谢!

见4F最后给出的链接。
作者: tghksj     时间: 2006-12-10 05:21
我真晕!!!

你不说那是个联接,我还一直以为是你要请教呢!!!

谢谢了啊!
作者: lxmxn     时间: 2006-12-10 07:32


  Quote:
Originally posted by 3742668 at 2006-12-10 02:40:

见4F最后给出的链接。


  我用那个链接里面的方法,即用 wmic computersystem ……来修改计算机名,试了几遍都没有成功,是照着一个个字符打上去的,可是还是不成功。不知道是怎么回事。