看到有人用Ghost文件还原了系统之后,在登入的时候,会弹出一个cmd的窗口要求输入新的HostName,感觉挺好玩的,就研究了下。我想原理应该就是简单地用批处理文件接受了用户输入的变量,而后再修改注册表里的对应项吧。下面是我参考了些资料,写的一个简单化的批处理文件:
@echo off
color a
set Name=%COMPUTERNAME%
:GetHostName
set /p Name=请输入新的机器名:
if %Name%==%COMPUTERNAME% goto GetHostName
reg add "HKLM\system\CurrentControlSet\services\tcpip\parameters" /v "NV Hostname" /d %Name% /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" /v ComputerName /d %Name% /f
echo 机器名已修改,重启后生效
pause
@echo on
set Name=%COMPUTERNAME%
:GetHostName
set /p Name=请输入新的机器名:
if %Name%==%COMPUTERNAME% goto GetHostName
reg add "HKLM\system\CurrentControlSet\services\tcpip\parameters" /v "NV Hostname" /d %Name% /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" /v ComputerName /d %Name% /f
echo 机器名已修改,重启后生效
pause
@echo on
这里用的是windows NT 5.1以后系统自带的reg.exe注册表工具修改注册表。有两个地方,我稍微介绍下。
1、如何使批处理文件接收用户的键盘输入
这里介绍两种方法,还有其他的方法欢迎提出。
其一,利用set命令。
set /P variable=[promptString],/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入行之前,显示指定的 promptString。promptString 可以是空的。提供的批处理文件就是使用了这种方法。
其二,利用%1、%2等传递参数。
如下一个批处理文件
@echo off
set Var=%1
echo %Var%
@echo on
set Var=%1
echo %Var%
@echo on
在命令行提示符下,输入批处理文件名称再输入空格加上变量数值,就可以把数值赋给了变量Var。
2、关于注册表中机器名的存放位置和关系
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"NV Domain"=""
"NV Hostname"="MYCHAT-2xxx"
"Domain"=""
"NV Hostname"="MYCHAT-2xxx"
"Domain"=""
"Hostname"="MYCHAT-2xxx"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName]
"ComputerName"="MYCHAT-2xxx"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName]
"ComputerName"="MYCHAT-2xxx"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName]
"ComputerName"="MYCHAT-2xxx"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName]
"ComputerName"="MYCHAT-2xxx"
上边的注册表文件反映了修改机器名时涉及到的几个地方。
其中"Hostname"、"Domain"对应当前机器的全域名(FQDN,Fully Qualified Domain Name)","NV Hostname"和"NV Domain"将在下一次重启时覆盖"Hostname"和"Domain"处。ActiveComputerName处的"ComputerName"对应当前NetBIOS名,另一处ComputerName将
在下一次重启时覆盖ActiveComputerName处。我们在"我的电脑"的属性里修改机器名,只是修改了"NV Hostname","NV Domain"和"ComputerName"处的"ComputerName",这样就需要重启后才能覆盖当前的机器名。
在下一次重启时覆盖ActiveComputerName处。我们在"我的电脑"的属性里修改机器名,只是修改了"NV Hostname","NV Domain"和"ComputerName"处的"ComputerName",这样就需要重启后才能覆盖当前的机器名。
FQDN和NetBIOS名之间没有必然的联系,NetBIOS名可用在很多地方,适用于TCP/IP、IPX/SPX、NetBEUI等实现了NetBIOS接口的通信协议。"nbtstat -A <target>"和设备管理器涉及到的都是当前NetBIOS名。FQDN却只用于TCP/IP协议,命令hostname.exe和ipconfig /all得到的就是FQDN里的主机名。
转载于:https://blog.51cto.com/tsingfu/75318
本文介绍了一个简单的批处理脚本,该脚本可在Windows NT 5.1及更高版本的系统中运行,用于接受用户输入的新主机名并更新注册表中的相应条目。文章详细解释了如何通过批处理文件接收用户输入,并说明了注册表中主机名存储的位置及其关系。
267

被折叠的 条评论
为什么被折叠?



