我有一台Windows服务器,有时更新后有时会重新引导到安全模式。我正在解决该问题,但我真正想知道的是如何检查Windows是否以安全模式运行。
理想情况下,我想将其合并到一个脚本中,该脚本会将状态显示为被动检查发送到我们的Nagios框中。
是否可以使用某些环境变量或通过命令行获取此信息的某种方式?
我有一台Windows服务器,有时更新后有时会重新引导到安全模式。我正在解决该问题,但我真正想知道的是如何检查Windows是否以安全模式运行。
理想情况下,我想将其合并到一个脚本中,该脚本会将状态显示为被动检查发送到我们的Nagios框中。
是否可以使用某些环境变量或通过命令行获取此信息的某种方式?
Answers:
我认为这就是您想要的
PS C:\> gwmi win32_computersystem | select BootupState
BootupState
-----------
Normal boot
http://msdn.microsoft.com/zh-CN/library/windows/desktop/aa394102%28v=vs.85%29.aspx
可能的返回值:
正常开机 故障安全启动 网络启动的故障安全
(gwmi win32_computersystem -Property BootupState).BootupState
根据本文,环境变量SAFEBOOT_OPTION
被设置为,Minimal
或者Network
系统是在安全模式下启动还是在网络安全模式下启动?否则,该变量未设置。
测试变量的值应该可以解决问题。但是,请记住,如果系统实际上以安全模式运行,则开始时将没有网络连接,因此报告其状态可能会很困难。
编辑:不好意思,我没有充分地阅读过知识库,以至于意识到它本身对回答几乎毫无用处。
一个更有效的方法来确定,如果你在不安全模式是:Microsoft® Windows® Internals: Microsoft Windows ServerTM 2003, Windows XP, and Windows 2000由马克E. Russinovich介绍,大卫·所罗门。
Windows内核会在引导过程中尽早扫描引导参数以搜索安全模式开关,并将内部变量InitSafeBootMode设置为一个反映内核找到的开关的值。内核将InitSafeBootMode值写入注册表值HKLM \ SYSTEM \ CurrentControlSet \ SafeBoot \ Option \ Option值,以便用户模式组件(例如SCM)可以确定系统所处的启动模式。
将上面的内容与下面的内容配对,您将拥有一个注册表位置,可以使用数字值进行检查,并将其转换为有用的值。
来自标题为“如何从设备驱动程序确定系统是否以安全模式运行”的support.microsoft KB。
Windows OS内核导出一个指向名为InitSafeBootMode的ULONG变量的指针。此变量包含安全模式设置。
设备驱动程序可以通过InitSafeBootMode变量的值确定系统是否在安全模式下运行。值0表示系统未在安全模式下运行。
下表列出了其他值的模式。
值 模式
1 SAFEBOOT_MINIMAL
2 SAFEBOOT_NETWORK
3 * SAFEBOOT_DSREPAIR
*注意值3仅适用于Windows域控制器。
InitSafeBootMode
?
HKLM\SYSTEM\CurrentControlSet\SafeBoot\Option
在非安全模式系统上根本不存在,但是在安全模式下却存在。