Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Перезагрузка компьютера в безопасный режим с помощью скрипта (http://forum.oszone.net/showthread.php?t=297520)

Kot86 26-03-2015 21:30 2488135

Перезагрузка компьютера в безопасный режим с помощью скрипта
 
Привет!
Существует ли способ перезагрузить компьютер в безопасный режим с помощью CMD/BAT/VBS/скрипта? Что-то типа
Код:

shutdown -r -s -t 00
, где "-s" — "Safe Mode" (это лишь пример, как это могло бы выглядеть)

Iska 26-03-2015 22:31 2488160

Kot86, в том виде, как Вы предполагаете — нет, не существует.

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

Kot86 27-03-2015 01:46 2488230

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 2488242

Kot86, я не проверял код.

Kot86 27-03-2015 07:21 2488259

В общем, сделал под все версии Windows (от Win2000 до Win10). Выглядит это так:
REBOOT.bat
PHP код:

Echo Off

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

:ver_nt5x
:Run Windows 2000/XP specific commands here
bootcfg 
/raw //safeboot:network /id 1
REG ADD HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnce 
/"*UndoSB" /t REG_SZ /"bootcfg /raw /fastdetect /id 1"
SHUTDOWN ---t 03
goto end

:ver_nt6x
:Run Windows Vista/7/8/8.1 specific commands here
bcdedit 
/set {currentsafeboot network
REG ADD HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnce 
/"*UndoSB" /t REG_SZ /"bcdedit /deletevalue {current} safeboot"
SHUTDOWN ---t 03
goto end

:ver_nt10x
:Run Windows 10 specific commands here
bcdedit 
/set {currentsafeboot network
REG ADD HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnce 
/"*UndoSB" /t REG_SZ /"bcdedit /deletevalue {current} safeboot"
SHUTDOWN ---t 03
goto end

Echo On

:warn_and_exit
echo Machine OS cannot be determined.

:
end 


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

Также можно вызывать "батник" с помощью VBS-скрипта, тогда запуск от администратора не потребуется, но нужно будет подтвердить предупреждение UAC:
REBOOT.vbs
PHP код:

Dim oShellreturnCode
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"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"64 0
End Select 


В данном случае эти два файла должны находиться в одной папке (например, на рабочем столе).

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

objShell.ShellExecute "REBOOT.bat""""""runas"

меняем "REBOOT.bat" на "D:\REBOOT.bat"

Получаем
PHP код:

objShell.ShellExecute "D:\REBOOT.bat""""""runas"

Сохраняем, пользуемся.

P.S. Спасибо Iska за ссылку!

MKN 26-08-2015 11:46 2546119

Как подкорректрировать вышеприведённый REBOOT.bat для выполнения следующей задачи ? :

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

Elven 26-08-2015 12:10 2546134

Цитата:

Цитата Iska
Единственно возможный путь — добавить в конфигурацию перечня ОС для загрузки новую строку, осуществляющую загрузку в безопасный режим, сделать её умолчальной, добавить в реестр однократный запуск команд, убирающих эту строку из конфигурации загрузки и возвращающей предыдущее умолчание, и перезагрузиться. После перезагрузки произойдёт загрузка в безопасный режим, тут же отработают команды на возвращение предыдущего поведения. »

Вот тут все написано. Вместе с отработкой команды на возврат стандартного запуска можно впихнуть этот твик.

MKN 26-08-2015 15:35 2546227

А что такое - "*UndoSB" ?

Iska 26-08-2015 16:10 2546249

Цитата:

Цитата MKN
А что такое - "*UndoSB" ? »

Насколько я понимаю — абсолютно произвольно взятое имя параметра.

MKN 26-08-2015 17:47 2546294

Elven,
Цитата:

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

Iska 26-08-2015 18:22 2546302

Цитата:

Цитата MKN
и никакой принудительной перезагрузки для возвращения в исходное состояние... »

Да, там:
Цитата:

Цитата Kot86
bcdedit /deletevalue {current} safeboot »

именно так — просто удаляется запись загрузчика в Safe Mode. А Вам, по идее, там надо прописать запуск на исполнение пакетного файла, в котором будет импорт файла реестра, затем описанное удаление записи загрузчика, затем команда на перезагрузку машины.

MKN 26-08-2015 18:28 2546304

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

Iska 26-08-2015 18:44 2546307

MKN, сожалею, тут:
Цитата:

Цитата MKN
Т.е. - не отрабатывается у меня почему то в RunOnce : bcdedit /deletevalue {current} safeboot. ( Может конкретный путь к bcdedit нужно указывать ? )
Принудительно, из внешнего скрипта - bcdedit /deletevalue {current} safeboot - работает нормально... »

— я Вам совершенно ничего внятного не подскажу: я только-только сел за Windows 7 (и то за «временно арендованную»).

MKN 27-08-2015 10:32 2546451

Был не внимателен...
Цитата:

Перед значением параметра поставьте *
http://forum.oszone.net/thread-113624.html

Lejapro 12-08-2016 12:39 2659120

кто повис в 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


Время: 21:22.

Время: 21:22.
© OSzone.net 2001-