Board logo

标题: [求助]如何判断系统是否是安全模式和添加协议? [打印本页]

作者: HUNRYBECKY     时间: 2006-12-29 05:22    标题: [求助]如何判断系统是否是安全模式和添加协议?

我做了一个RPL无盘系统,因为要在替换大量的系统文件,在正常模式下是无法替换文件的,必须在安全模式下才能替换成功。我想实现这样的功能
1。判断系统当前运行的模式是否是安全模式?如果不是,提示用户切换到安全模式。
2。在安全模式下运行程序后RPL无盘使用的文件已经复制到系统中,但如何在本地连接属性中自动添加DLC和NETBIOS协议?(通过写注册表实现也可以)

我的部分代码(如何实现REM1和REM2中的步骤?):
@ECHO OFF
REM 本程序用于设置远程启动的注册表和其他项目,需要则安全模式下使用.

REM 1.判断系统是否是安全模式,这里采用人工判断
>%Temp%\msg.vbs   ECHO intAnswer = MsgBox("本设置只能在安全模式下进行,要继续吗?" + vbCrLf + "安全模式下替换了相关文件后需要重新启动系统在正常模式下添加DLC和NETBIOS协议!", vbExclamation+vbYesNo, "小不点温馨提示!")
>>%Temp%\msg.vbs  ECHO IF intAnswer = vbYes Then
>>%Temp%\msg.vbs  ECHO Wscript.Echo "GO"
>>%Temp%\msg.vbs  ECHO ELSE
>>%Temp%\msg.vbs  ECHO Wscript.Echo "END"
>>%Temp%\msg.vbs  ECHO END IF
FOR /f "delims=" %%i in ('"cscript //nologo %Temp%\msg.vbs"') do (GOTO %%i)

:GO
REM 2.复制协议文件和替换相关文件
XCOPY /S/C/H/R/Y backup\files\*.*  %WINDIR%\ & CLS

REM 3.安装协议,这里提示手动安装


REM 4.设置注册表远程启动项目:其实可以直接把Directory改为字符串导入也可以,这里保留REG_EXPAND_SZ类型
REM   还需要注意,BINSUB工具只能修改ANSII编码格式,所以直接导出的注册表无法直接替换,需要使用TYPE命令转化为ANSII码(原创)
SET CPATH=%CD%
CD backup\reg\
ECHO SET RPATH=%CPATH%>RPATH.BAT
binsub RPATH.BAT \ \\ /I & CLS
CALL RPATH.BAT
TYPE CR.BAK >CR.SVR
binsub CR.SVR C:\\Rpl\\ %RPATH%\\ /I & CLS
REGEDIT /S CR.SVR & CLS
IF EXIST RPATH.BAT DEL RPATH.BAT /Q/F
IF EXIST *.ubk DEL *.ubk /Q/F
IF EXIST CR.SVR DEL CR.SVR /Q/F
CHCP 936 & CLS

SET RB1=HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\RemoteBoot\Parameters
REG ADD "%RB1%" /V Directory /t REG_EXPAND_SZ /d "%CPATH%" /f & CLS
SET RB2=HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\RemoteBoot\Parameters
REG ADD "%RB2%" /V Directory /t REG_EXPAND_SZ /d "%CPATH%" /f & CLS
SET RB3=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteBoot\Parameters
REG ADD "%RB3%" /V Directory /t REG_EXPAND_SZ /d "%CPATH%" /f & CLS
CD..\..
DIR
GOTO END

:END
IF EXIST %TEMP%\MSB.VBS DEL %TEMP%\MSB.VBS /F/Q
@ECHO ON
EXIT
目前已经解决了是否是安全模式的判断,采用9楼everest79的注册表方法和15楼NaturalJ0兄的工具都可以,非常感谢两位的帮助,现在主要的问题是如何CMD下或使用DOS工具安装网络协议。

[ Last edited by HUNRYBECKY on 2006-12-30 at 10:16 PM ]
作者: HUNRYBECKY     时间: 2006-12-29 05:30
在ACCESS911看到一个判断是否是安全模式的函数,可是这个函数怎么用脚本来调用呢?
GetSystemMetrics

The GetSystemMetrics function retrieves various system metrics (widths and heights of display elements) and system configuration settings. All dimensions retrieved by GetSystemMetrics are in pixels.


int GetSystemMetrics(
  int nIndex
);

Parameters
nIndex
[in] System metric or configuration setting to retrieve. This parameter can be one of the following values. Note that all SM_CX* values are widths and all SM_CY* values are heights. Value Meaning
SM_ARRANGE Flags specifying how the system arranged minimized windows. For more information about minimized windows, see the following Remarks section.
SM_CLEANBOOT Value that specifies how the system was started:
0 Normal boot
1 Fail-safe boot
2 Fail-safe with network boot

Fail-safe boot (also called SafeBoot, Safe Mode, or Clean Boot) bypasses the user's startup files.

int result = GetSystemMetrics(SM_CLEANBOOT);
switchresult)
{
...
}
作者: everest79     时间: 2006-12-29 06:18
这个给c++用的
作者: HUNRYBECKY     时间: 2006-12-29 10:20
自己顶一下。
作者: HUNRYBECKY     时间: 2006-12-29 21:35
没有人回答,在顶一下,在线等待,可能有点难道,我也搜索了整个世界,找不到相关代码。
作者: everest79     时间: 2006-12-29 23:00
你在安全模式下与常规模式下对比下以下注册表键值
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
作者: HUNRYBECKY     时间: 2006-12-30 00:01


  Quote:
Originally posted by everest79 at 2006-12-29 23:00:
你在安全模式下与常规模式下对比下以下注册表键值
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

安全模式下除了不加载网络外还去掉很多其他东西,所以通过这样比较注册表不行的。

似乎通过注册表来添加协议是不可取的,我使用注册表监视工具对比添加前后的变化,发现改变的东西太多了,还有就是网卡不同可能会影响这些注册表参数。
寻求有没有什么DOS工具或命令来添加协议?
作者: everest79     时间: 2006-12-30 00:18
这个键下好像保存了系统当前启动参数,而安全模式本来就是以safereboot的参数来启动的,所以让你对比一下,因为我没试过

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=\"Microsoft Windows XP Professional\" /noexecute=optin /fastdetect /safeboot:minimal
你看这就是安全模式了
作者: everest79     时间: 2006-12-30 00:25
安全模式下:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control]
"SystemStartOptions"="NOEXECUTE=OPTIN  FASTDETECT SAFEBOOT:MINIMAL SOS BOOTLOG NOGUIBOOT"
"SystemBootDevice"="multi(0)disk(0)rdisk(0)partition(1)"
正常情况下:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control]
"SystemStartOptions"="NOEXECUTE=OPTIN  FASTDETECT"
"SystemBootDevice"="multi(0)disk(0)rdisk(0)partition(1)"

作者: everest79     时间: 2006-12-30 00:26
为了这个问题重启了次电脑
作者: HUNRYBECKY     时间: 2006-12-30 00:27


  Quote:
Originally posted by everest79 at 2006-12-30 00:26:
为了这个问题重启了次电脑

非常感谢胸的回答。
作者: HUNRYBECKY     时间: 2006-12-30 00:27
不知道能否添加协议,如果能这样就好了,我目前是提示用户手动添加协议的。
作者: everest79     时间: 2006-12-30 00:39
无盘我不清楚,在有盘的LAN里,终端或只有一个连接的情况下,可以在正常模式下登录加载安装脚本,脚本主要功能是访问RIS路径来执行inf文件
例如你的netbios,其实你只需要打安装光盘提取ipx的inf及驱动文件就可以了
作者: HUNRYBECKY     时间: 2006-12-30 04:02


  Quote:
Originally posted by everest79 at 2006-12-30 00:39:
无盘我不清楚,在有盘的LAN里,终端或只有一个连接的情况下,可以在正常模式下登录加载安装脚本,脚本主要功能是访问RIS路径来执行inf文件
例如 ...

我自己做的RPL无盘系统,只要把文件解压缩后执行上面的批处理就可以成功启动并登陆到终端系统了,很方便,但是批处理编程过程中有些问题比较难解决,协议可以在正常模式下复制过去,但是协议的添加则需要手动才行,我想改为有批处理完成。还有就是有些RPL启动文件如netui0.dll等在正常模式下是无法复制到系统目录中的,只有在DOS或安全模式下才行,所以产生了判断安全模式的问题。
作者: NaturalJ0     时间: 2006-12-30 05:22
用楼主提到的 GetSystemMetrics 做了个 EXE ,楼主试试,如果能用的话,你就当是第三方工具吧。
附件 1: SM_CLEANBOOT.zip (2006-12-30 05:22, 1.58 K, 下载附件所需积分 1点 ,下载次数: 21)

作者: everest79     时间: 2006-12-30 19:35


  Quote:
Originally posted by HUNRYBECKY at 2006-12-29 03:02 PM:


我自己做的RPL无盘系统,只要把文件解压缩后执行上面的批处理就可以成功启动并登陆到终端系统了,很方便,但是批处理编程过程中有些问题比辠...

嘻嘻,忘了,将IPX协议安装至系统后需要使用netsh来对某个接口进行IPX配置
具体方法你对比安装IPX与没安装IPX机器的netsh脚本就可以看到了
netsh dump
作者: HUNRYBECKY     时间: 2006-12-30 21:58


  Quote:
Originally posted by everest79 at 2006-12-30 00:18:
这个键下好像保存了系统当前启动参数,而安全模式本来就是以safereboot的参数来启动的,所以让你对比一下,因为我没试过

multi(0)disk(0)rdisk(0)partiti ...

如果用户手动启动到安全模式这个就无法判断,因为手动F8启动后应该不会写如BOOT。INI中。
作者: HUNRYBECKY     时间: 2006-12-30 22:02


  Quote:
Originally posted by everest79 at 2006-12-30 19:35:


嘻嘻,忘了,将IPX协议安装至系统后需要使用netsh来对某个接口进行IPX配置
具体方法你对比安装IPX与没安装IPX机器的netsh脚本就可以看到了
netsh dump

看了,但是这个是安装后如何配置,但并不是如何安装的问题,所以问题难以解决。
作者: HUNRYBECKY     时间: 2006-12-30 22:16


  Quote:
Originally posted by NaturalJ0 at 2006-12-30 05:22:
用楼主提到的 GetSystemMetrics 做了个 EXE ,楼主试试,如果能用的话,你就当是第三方工具吧。

你编写的工具很好用。非常感谢NaturalJ0兄,如果方便的话能否贴出原代码供大家参考。
作者: everest79     时间: 2006-12-31 03:13


  Quote:
Originally posted by HUNRYBECKY at 2006-12-30 08:58 AM:



如果用户手动启动到安全模式这个就无法判断,因为手动F8启动后应该不会写如BOOT。INI中。

你需要对比的是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control键下SystemStartOptions的字符串值,不是BOOT.INI

不管以那种方式启动到安全模式,在这个键下都会做下纪录

协议安装就分两部份,先是用inf安装至系统,再用netsh来配置
作者: NaturalJ0     时间: 2006-12-31 23:58


  Quote:
Originally posted by HUNRYBECKY at 2006-12-30 22:16:


你编写的工具很好用。非常感谢NaturalJ0兄,如果方便的话能否贴出原代码供大家参考。

#include ...

int main (...)
{
...
if (GetSystemMetrics(SM_CLEANBOOT)==0) cout<<"Normal boot"<<endl;//其实就用的这句
...
}

不过,这已经超出本版块批处理范畴了。 = =b
作者: HUNRYBECKY     时间: 2007-1-3 02:44


  Quote:
Originally posted by NaturalJ0 at 2006-12-31 23:58:


#include ...

int main (...)
{
...
if (GetSystemMetrics(SM_CLEANBOOT)==0) cout<<"Normal boot"<<endl;//其实就用的这句
...
}

不过,这已经超出本版坠...

虽然已经超出本板范围,但是给学习其他语言的提供一个参考,再次谢谢NaturalJ0兄弟
作者: HUNRYBECKY     时间: 2007-1-3 02:49


  Quote:
Originally posted by everest79 at 2006-12-31 03:13:


你需要对比的是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control键下SystemStartOptions的字符串值,不是BOOT.INI

不管以那种方式启动到安全模式,在这个键下郠...

启动方式的判断问题已经解决,采用你的方法,但是协议安装的问题一直比较难办,因为你说的哪个命令只能对安装后的进行配置
作者: netmouse     时间: 2008-6-20 13:26
thank you very much
downloading for test.
作者: quya     时间: 2008-6-20 13:44
正好前几天也碰到此类问题, 其实解决的办法很容易.
if not defined SAFEBOOT_OPTION ECHO 请进入安全模式运行此程序!&GOTO END

作者: everest79     时间: 2008-6-20 22:15
up 25