Войти

Показать полную графическую версию : [решено] Перезагрузка компьютера в безопасный режим с помощью скрипта


Kot86
26-03-2015, 21:30
Привет!
Существует ли способ перезагрузить компьютер в безопасный режим с помощью CMD/BAT/VBS/скрипта? Что-то типа shutdown -r -s -t 00, где "-s" — "Safe Mode" (это лишь пример, как это могло бы выглядеть)

Iska
26-03-2015, 22:31
Kot86, в том виде, как Вы предполагаете — нет, не существует.

Единственно возможный путь — добавить в конфигурацию перечня ОС для загрузки новую строку, осуществляющую загрузку в безопасный режим, сделать её умолчальной, добавить в реестр однократный запуск команд, убирающих эту строку из конфигурации загрузки и возвращающей предыдущее умолчание, и перезагрузиться. После перезагрузки произойдёт загрузка в безопасный режим, тут же отработают команды на возвращение предыдущего поведения. Примерно так: vbscript - How do I restart a computer in safe mode with a Windows script? - Stack Overflow (http://stackoverflow.com/questions/13975779/how-do-i-restart-a-computer-in-safe-mode-with-a-windows-script).

Kot86
27-03-2015, 01:46
Iska, благодарю! То, что нужно! Только запускать надо от админа, иначе идёт простой ребут.
P.S. Я так понимаю, что это :ver_nt5x
:Run Windows 2000/XP specific commands here
bootcfg /raw /a /safeboot:network /id 1
REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce /v "*UndoSB" /t REG_SZ /d "bootcfg /raw /fastdetect /id 1"
SHUTDOWN -r -f -t 05
goto end можно вырезать для Windows 7?

Iska
27-03-2015, 03:51
Kot86, я не проверял код.

Kot86
27-03-2015, 07:21
В общем, сделал под все версии Windows (от Win2000 до Win10). Выглядит это так:
Echo Off

REM Check Windows Version
ver | findstr /i "5\.0\." > nul
IF %ERRORLEVEL% EQU 0 goto ver_nt5x
ver | findstr /i "5\.1\." > nul
IF %ERRORLEVEL% EQU 0 goto ver_nt5x
ver | findstr /i "5\.2\." > nul
IF %ERRORLEVEL% EQU 0 goto ver_nt5x
ver | findstr /i "6\.0\." > nul
IF %ERRORLEVEL% EQU 0 goto ver_nt6x
ver | findstr /i "6\.1\." > nul
IF %ERRORLEVEL% EQU 0 goto ver_nt6x
ver | findstr /i "6\.2\." > nul
IF %ERRORLEVEL% EQU 0 goto ver_nt6x
ver | findstr /i "6\.3\." > nul
IF %ERRORLEVEL% EQU 0 goto ver_nt6x
ver | findstr /i "10\.0\." > nul
IF %ERRORLEVEL% EQU 0 goto ver_nt10x
goto warn_and_exit

:ver_nt5x
:Run Windows 2000/XP specific commands here
bootcfg /raw /a /safeboot:network /id 1
REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce /v "*UndoSB" /t REG_SZ /d "bootcfg /raw /fastdetect /id 1"
SHUTDOWN -r -f -t 03
goto end

:ver_nt6x
:Run Windows Vista/7/8/8.1 specific commands here
bcdedit /set {current} safeboot network
REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce /v "*UndoSB" /t REG_SZ /d "bcdedit /deletevalue {current} safeboot"
SHUTDOWN -r -f -t 03
goto end

:ver_nt10x
:Run Windows 10 specific commands here
bcdedit /set {current} safeboot network
REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce /v "*UndoSB" /t REG_SZ /d "bcdedit /deletevalue {current} safeboot"
SHUTDOWN -r -f -t 03
goto end

Echo On

:warn_and_exit
echo Machine OS cannot be determined.

:end
Запускать нужно от имени администратора.

Также можно вызывать "батник" с помощью VBS-скрипта, тогда запуск от администратора не потребуется, но нужно будет подтвердить предупреждение UAC:
Dim oShell, returnCode
Set objShell = CreateObject("Shell.Application")
Set oShell = WScript.CreateObject("WScript.Shell")

returnCode = oShell.Popup("Do you want to restart your computer in Safe Mode", 0, "Restart In Safe Mode", 4 + 48 + 256)

Select Case returnCode
case 6, -1
objShell.ShellExecute "REBOOT.bat", "", "", "runas", 0
case 7
oShell.popup "Operation Canceled", 0, "Restart In Safe Mode", 0 + 64 + 0
End Select
В данном случае эти два файла должны находиться в одной папке (например, на рабочем столе).

Чтобы была возможность запускать эти файлы из разных папок, нужно лишь в файле REBOOT.vbs указать путь до файла REBOOT.bat.
Пример: кидаем файл REBOOT.bat в корень диска D:, получается D:\REBOOT.bat
Открываем блокнотом файл REBOOT.vbs и в строке objShell.ShellExecute "REBOOT.bat", "", "", "runas", 0 меняем "REBOOT.bat" на "D:\REBOOT.bat"

Получаем objShell.ShellExecute "D:\REBOOT.bat", "", "", "runas", 0
Сохраняем, пользуемся.

P.S. Спасибо Iska за ссылку (http://stackoverflow.com/questions/13975779/how-do-i-restart-a-computer-in-safe-mode-with-a-windows-script)!

MKN
26-08-2015, 11:46
Как подкорректрировать вышеприведённый REBOOT.bat для выполнения следующей задачи ? :

Запускаем cmd (bat) файл из обычной среды Win7-10,
компьютер перезагружается в режим SafeMode,
применяется рег твик из внешнего reg файла (или из того же запускаемого cmd )
компьютер перезагружается,
и загружается обычным образом ОС, с применёнными изменениями в реестре

Elven
26-08-2015, 12:10
Единственно возможный путь — добавить в конфигурацию перечня ОС для загрузки новую строку, осуществляющую загрузку в безопасный режим, сделать её умолчальной, добавить в реестр однократный запуск команд, убирающих эту строку из конфигурации загрузки и возвращающей предыдущее умолчание, и перезагрузиться. После перезагрузки произойдёт загрузка в безопасный режим, тут же отработают команды на возвращение предыдущего поведения. »
Вот тут все написано. Вместе с отработкой команды на возврат стандартного запуска можно впихнуть этот твик.

MKN
26-08-2015, 15:35
А что такое - "*UndoSB" ?

Iska
26-08-2015, 16:10
А что такое - "*UndoSB" ? »
Насколько я понимаю — абсолютно произвольно взятое имя параметра.

MKN
26-08-2015, 17:47
Elven,
тут же отработают команды на возвращение предыдущего поведения
После запуска REBOOT.bat - SafeMode и никакой принудительной перезагрузки для возвращения в исходное состояние...
ОС - Win10Pro x64.. Запуск от имени админа. В чём может быть дело ?

Iska
26-08-2015, 18:22
и никакой принудительной перезагрузки для возвращения в исходное состояние... »
Да, там:
bcdedit /deletevalue {current} safeboot »
именно так — просто удаляется запись загрузчика в Safe Mode. А Вам, по идее, там надо прописать запуск на исполнение пакетного файла, в котором будет импорт файла реестра, затем описанное удаление записи загрузчика, затем команда на перезагрузку машины.

MKN
26-08-2015, 18:28
Iska,
Да я пока про рег твик и не думаю. Застрял в SafeMode , хотя и запись в RunOnce : bcdedit /deletevalue {current} safeboot - есть, и принудительную перезагрузку делаю.
Без результата. Всё время после перезагрузки возвращаюсь в SafeMode...
Т.е. - не отрабатывается у меня почему то в RunOnce : bcdedit /deletevalue {current} safeboot. ( Может конкретный путь к bcdedit нужно указывать ? )
Принудительно, из внешнего скрипта - bcdedit /deletevalue {current} safeboot - работает нормально...

Iska
26-08-2015, 18:44
MKN, сожалею, тут:
Т.е. - не отрабатывается у меня почему то в RunOnce : bcdedit /deletevalue {current} safeboot. ( Может конкретный путь к bcdedit нужно указывать ? )
Принудительно, из внешнего скрипта - bcdedit /deletevalue {current} safeboot - работает нормально... »
— я Вам совершенно ничего внятного не подскажу: я только-только сел за Windows 7 (и то за «временно арендованную»).

MKN
27-08-2015, 10:32
Был не внимателен...
Перед значением параметра поставьте *
http://forum.oszone.net/thread-113624.html

Lejapro
12-08-2016, 12:39
кто повис в safe mode, нормальная перезагрузка.
' http://windoza.ucoz.de/

If WScript.Arguments.length =0 Then
Set objShell = CreateObject("Shell.Application")
objShell.ShellExecute "wscript.exe", Chr(34) & WScript.ScriptFullName & Chr(34) & " Run", , "runas", 1
Else
Set objShell2 = WScript.CreateObject("WScript.Shell")
objShell2.Run "bcdedit /deletevalue {current} safeboot",0,True
objShell2.Run "shutdown -r -t 00 -f",0,True
End If




© OSzone.net 2001-2012