ฉันจะรู้ได้อย่างไรว่า Windows กำลังทำงานในเซฟโหมดหรือไม่


14

ฉันมีเซิร์ฟเวอร์ Windows ที่บางครั้งจะรีบูทเข้าสู่เซฟโหมดหลังจากอัพเดต ฉันทำงานเกี่ยวกับปัญหานั้น แต่สิ่งที่ฉันอยากรู้จริงๆคือฉันจะตรวจสอบได้อย่างไรว่า Windows ทำงานในเซฟโหมดหรือไม่

เป็นการดีที่ฉันต้องการรวมไว้ในสคริปต์ที่จะส่งการตรวจสอบแฝงไปยังกล่อง Nagios ของเราที่มีสถานะ

มีตัวแปรสภาพแวดล้อมที่ฉันสามารถใช้หรือวิธีการบางอย่างเพื่อรับข้อมูลนี้ผ่านบรรทัดคำสั่งหรือไม่


1
ไม่มี "โหมดผู้ใช้คนเดียว" ใน Windows ... คุณกำลังพูดถึงเซฟโหมดหรือไม่
Massimo

1
อัปเดตคำถามและเปลี่ยน "โหมดผู้ใช้คนเดียว" เป็น "Safe Mode" - คำขอโทษของฉัน
cwd

คำถามนี้น่าสนใจจริง ๆ ฉันไปเที่ยวไปรอบ ๆ และไม่พบวิธีที่สมเหตุสมผล (เช่น "โดยไม่ต้องใช้ไดรเวอร์อุปกรณ์") เพื่อตรวจสอบโดยทางโปรแกรมว่าระบบทำงานในเซฟโหมดหรือไม่ ... ฉัน upvoting แต่โปรดตอบคำตอบของ @joeqwerty ในขณะที่เขากำลังพูดถึง Terminal Services
Massimo

3
คุณกำลังทำสิ่งนี้ผิดอย่างสมบูรณ์ หากคุณมีเซิร์ฟเวอร์ที่บางครั้งบูทเข้าสู่เซฟโหมดคุณควรมองหาสาเหตุที่แท้จริงไม่ใช่วิธีการรักษาอาการ เซิร์ฟเวอร์จะทำเช่นนั้นหลังจากเกิดความผิดพลาดอย่างรุนแรง ค้นหาสิ่งที่ทำให้เกิดปัญหาและแก้ไข
John Gardeniers

2
@JohnGardeniers พูดตามตรงเขาบอกว่าเขากำลังทำเรื่องนี้อยู่ ...
Massimo

คำตอบ:


23

ฉันคิดว่านี่เป็นสิ่งที่คุณต้องการ

PS C:\> gwmi win32_computersystem | select BootupState

BootupState
-----------
Normal boot

http://msdn.microsoft.com/en-us/library/windows/desktop/aa394102%28v=vs.85%29.aspx

ค่าส่งคืนที่เป็นไปได้:

บูตปกติ
บูตไม่ปลอดภัย
ไม่ปลอดภัยด้วยการบู๊ตเครือข่าย

Niiiiiiiiice ...
Massimo

ใช้วิธีอื่น: (gwmi win32_computersystem -Property BootupState).BootupState
Jaykul

8

อ้างอิงจากบทความนี้ตัวแปรสภาพแวดล้อมที่เรียกว่าSAFEBOOT_OPTIONถูกตั้งค่าเป็นอย่างใดอย่างหนึ่งMinimalหรือNetworkถ้าระบบเริ่มในเซฟโหมดหรือในเซฟโหมดที่มีระบบเครือข่าย มิฉะนั้นตัวแปรจะไม่ถูกตั้งค่า

การทดสอบค่าของตัวแปรควรทำการหลอกลวง อย่างไรก็ตามโปรดทราบว่าหากระบบใช้งานจริงใน Safe Mode มันจะไม่มีเครือข่ายที่จะเริ่มต้นด้วยดังนั้นการรายงานสถานะของมันอาจเป็นเรื่องยาก


ยืนยันสิ่งนี้ในการรีบูตเซฟโหมดอย่างรวดเร็วด้วย
Massimo

3

แก้ไข: ฉันไม่ดีฉันไม่ได้อ่าน KB อย่างละเอียดพอที่จะตระหนักว่ามันไร้ประโยชน์โดยทั่วไปเป็นคำตอบของมันเอง

วิธีที่มีประโยชน์มากขึ้นในการตรวจสอบว่าคุณอยู่ในโหมดปลอดภัยไม่เป็นจาก : Microsoft® Windows® Internals: Microsoft Windows ServerTM 2003, Windows XP, and Windows 2000โดยมาร์คอี Russinovich, เดวิดเอโซโลมอน

เคอร์เนล Windows จะสแกนพารามิเตอร์การบู๊ตเพื่อค้นหาสวิตช์ของเซฟโหมดก่อนระหว่างการบู๊ตและตั้งค่าตัวแปรภายในInitSafeBootModeเป็นค่าที่สะท้อนถึงสวิตช์ที่เคอร์เนลพบ เคอร์เนลเขียนค่าInitSafeBootMode เป็นค่ารีจิสตรีHKLM \ SYSTEM \ CurrentControlSet \ SafeBoot \ Option \ Option Valueเพื่อให้องค์ประกอบโหมดผู้ใช้เช่น SCM สามารถกำหนดโหมดการบูตที่ระบบอยู่

จดด้านบนและจับคู่กับด้านล่างและคุณจะมีตำแหน่งรีจิสตรีที่คุณสามารถตรวจสอบด้วยค่าตัวเลขที่คุณสามารถแปลเป็นสิ่งที่มีประโยชน์

จาก support.microsoft KB มีชื่อว่า "วิธีการตรวจสอบว่าระบบทำงานใน Safe Mode จากไดรเวอร์อุปกรณ์หรือไม่"

เคอร์เนล Windows OS ส่งออกตัวชี้ไปยังตัวแปร ULONG ที่ชื่อ InitSafeBootMode ตัวแปรนี้มีการตั้งค่า Safe Mode

ไดรเวอร์อุปกรณ์สามารถตรวจสอบว่าระบบกำลังทำงานอยู่ในเซฟโหมดโดยค่าของตัวแปร InitSafeBootMode ค่า 0 หมายความว่าระบบไม่ได้ทำงานใน Safe Mode

ตารางต่อไปนี้แสดงโหมดสำหรับค่าอื่น ๆ โหมด
ค่า 1 SAFEBOOT_MINIMAL 2 SAFEBOOT_NETWORK 3 * SAFEBOOT_DSREPAIR * หมายเหตุค่า 3 ใช้กับตัวควบคุมโดเมน Windows เท่านั้น




วิธีใดในการตรวจสอบผ่านทางบรรทัดคำสั่งหรือฉันจะต้องเขียนแอปพลิเคชันที่สามารถตรวจสอบได้InitSafeBootMode?
cwd

นั่นคือสิ่งที่ฉันพูดถึงกับความคิดเห็นของฉัน "ฉันไม่สามารถหาวิธีที่เหมาะสม" ... แม้ว่าคุณจะสามารถเขียนโปรแกรมควบคุมอุปกรณ์เพื่อตรวจสอบว่าได้รับมันเพื่อให้ทำงานบนระบบเป้าหมายจะค่อนข้างยุ่งยาก
Massimo

@cwd คุณจะต้องใช้ไดรเวอร์โหมดเคอร์เนลจริงๆ และจะมีการติดตั้ง และทำงานได้แม้ในเซฟโหมด จากนั้นแอปพลิเคชันเพื่อพูดคุยกับไดรเวอร์และรายงานสถานะของมัน นี้จะได้รับน่าเกลียดจริงๆอย่างรวดเร็วจริงๆ
Massimo

1
@cwd คุณไปไม่ได้ตรวจสอบอย่างใกล้ชิดพอเมื่อฉันพบลิงก์ไปยัง KB คำตอบควรมีข้อมูลที่เป็นประโยชน์สำหรับคุณตอนนี้
HopelessN00b

@ HopelessN00b ได้รับการยืนยัน (จริง ๆ แล้วฉันเริ่มระบบใหม่ในเซฟโหมดเพื่อตรวจสอบ) กุญแจHKLM\SYSTEM\CurrentControlSet\SafeBoot\Optionไม่มีอยู่เลยในระบบที่ไม่ใช่ Safe-Mode แต่มันจะทำใน Safe Mode หนึ่ง
Massimo

3

คุณยังสามารถเรียกใช้แบบสอบถาม WMI ที่แนะนำโดยCraig620โดยตรงจากบรรทัดคำสั่งหากคุณไม่ได้ใช้ PowerShell:

> wmic COMPUTERSYSTEM GET BootupState

BootupState
Normal boot

1

HKLM \ SYSTEM \ CurrentControlSet \ Control \ SystemStartOptions มีสตริงและถ้าคุณอยู่ในเซฟโหมดจะมี "SAFEBOOT: ???" ภายในสตริงที่ ??? คือ MINIMAL หรือ NETWORK สิ่งนี้จะได้รับการอัพเดตในการบู๊ตแต่ละครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.