Перезагрузка компьютера из командной строки
В некоторых случаях требуется перезагрузить компьютер из командной строки, пакетного файла, через удаленный доступ или в автоматическим режиме без участия человека (например, через планировщик). В этом случае привычная комбинация меню "Пуск" - "Завершение работы", естественно, недоступна. Можно, конечно, воспользоваться сторонними утилитами различных разработчиков, скриптами AutoIt и другими вспомогательными средствами, но они могут быть не всегда доступны. Здесь я собрал несколько способов перезагрузки компьютера с использованием команд самой операционной системы. Некоторые из них работают только на определенных версиях Windows, а некоторые универсальные.Первая универсальная команда перезагрузки через shutdown, работающая на Windows XP и Windows 7. Параметры команды: -r - перезагрузка (reboot), -f - остановить все запущенные приложения, -t 0 - перезагрузить сразу же, без ожидания.
shutdown -t 0 -r -f
Вторая команда экзотичная, выполняется через команду ping. Работает также на Windows XP и Windows 7:
ping -n 0 127.0.0.1>nul&wmic OS WHERE Primary="TRUE" CALL Win32Shutdown 6
Следующие две команды специфичны только для Windows XP. Эта работает на всех версиях Windows XP:
rundll32 user.exe,ExitWindowsExec 2
А эта работает только до версии SP2 включительно. Останавливается служба журнала событий, после чего система автоматически уходит в перезагрузку. На более новых системах подобный фокус не срабатывает.
echo y|net stop eventlog
Следующий метод перезагрузки самый громоздкий и основан на использовании скрипта VBS. Скрипт состоит из нескольких строчек, поэтому его придется создавать через команды консоли copy con имя_файла.vbs или через перенаправление вывода команды echo в файл. Зато сохраненный файл можно использовать в будущем. Такой способ подходит для Windows XP и Windows 7.
set objWMIService = GetObject("winmgmts:" & "{impersonationLevel = impersonate}!\\.\root\cimv2")
set colSoftware = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
for each objSoftware in colSoftware
objSoftware.Win32Shutdown 1
next
И напоследок команда для перевода компьютера в спящий режим (hibernate). Команда работает на Windows 7 и требует прав Администратора:
rundll32.exe powrprof.dll,SetSuspendState
Надеюсь, что эта информация окажется вам полезной. Если вы знаете еще какие-нибудь интересные способы перезагрузки, то напишите в комментариях, я обязательно добавлю их в статью.
Просмотров: 123053 | Комментариев: 18
Метки: система, безопасность
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
asdf
(17.06.2020 в 22:26):
А если серьёзно, второй способ без пинга сработает?
ManHunter
(20.07.2017 в 16:38):
Я всегда работаю под админской учеткой, даже проверить не на чем.
Андрей
(20.07.2017 в 16:31):
Можно ли перезагрузить через windows + R командой shutdown не имея прав пользователя админа ?
kim
(26.05.2015 в 16:53):
psshutdown -r -f -t 20 -m "До свидания ШЕУ."
Lvbnhbq
(02.05.2015 в 00:19):
Спс очень помог shutdown -t 0 -r -f
dr_mom
(29.11.2013 в 03:23):
Странно, на моей XP только shutdown -t 0 -r -f сработала :(
Александр
(30.05.2013 в 04:49):
Спасибо! Очень нужный материал!
Николай
(15.12.2012 в 00:58):
единственный вариант получился - отключить питание...
dec
(16.10.2012 в 01:47):
Сергей, спасибо.
Понадобилась перезагрузка Win98, а времени вспоминать небыло.
Понадобилась перезагрузка Win98, а времени вспоминать небыло.
ManHunter
(05.05.2012 в 12:42):
sc.septimus, понял, спасибо за примеры и за дополнения!
sc.septimus
(04.05.2012 в 21:13):
Нифига не сам с собою. Сначала добавил до коллекции, а потом уже глянул детально твой вариант vbscript и написал замечания.
ManHunter
(04.05.2012 в 11:14):
ээээ... "тихо сам с собою я веду беседу"? :)
sc.septimus
(04.05.2012 в 11:13):
Несколько замечаний от любителя
1)В Вашем варианте после префикса "WinMgmts:" в моникере WMI используется такой параметр безопасности как уровень олицетворения DCOM (DCOM Impersonation Level) "WinMgmts:{impersonationLevel=Impersonate}". Проще использовать назначенные или отозванные привилегии, например, "WinMgmts:{(Shutdown, !RemoteShutdown)}" в нашем случае "WinMgmts:{(Shutdown)}"
2)Вы пытаететь работать с пространством имен по умолчанию, которое извлекается из подраздела HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\Scripting\Default Namespace. В нашем случае таким пространством является Root\CIMV2.
Тогда вот это:
set objWMIService = GetObject("winmgmts:" & "{impersonationLevel = impersonate}!\\.\root\cimv2") можно смело сократить до вот этого:
set objWMIService = GetObject("winmgmts:"),
т.к. ваш случай больше подходит для перезагрузки удаленных станций.
Я бы понял такой вариант:
objWMIService = GetObject("winmgmts:" & "{impersonationLevel = impersonate}!\\VPUPKIN_COMP\root\cimv2". Но зачем так много писать для локального компа?
3)ObjOperatingSystem.Win32Shutdown(1) выключит машину, а не перезагрузит/ Либо параметр (2) либо ObjOperatingSystem.Reboot()
Log Off - objOperatingSystem.Win32Shutdown(0)
Forced Log Off - objOperatingSystem.Win32Shutdown(0 + 4)
Shutdown - objOperatingSystem.Win32Shutdown(1)
Forced Shutdown - objOperatingSystem.Win32Shutdown(1 + 4)
Reboot - objOperatingSystem.Win32Shutdown(2)
Forced Reboot - objOperatingSystem.Win32Shutdown(2 + 4)
Power Off - objOperatingSystem.Win32Shutdown(8)
Forced Power Off - objOperatingSystem.Win32Shutdown(8 + 4)
4)Ваш вариант на Windows 7 вместо перезагрузки выдаст лаконичное "Privilege not Held"
Этот вариант будет работать и на семерке и на XP:
set objWMIService = GetObject("winmgmts:{(Shutdown)}")
set colSoftware = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
for each objSoftware in colSoftware
objSoftware.Win32Shutdown(2)
next
1)В Вашем варианте после префикса "WinMgmts:" в моникере WMI используется такой параметр безопасности как уровень олицетворения DCOM (DCOM Impersonation Level) "WinMgmts:{impersonationLevel=Impersonate}". Проще использовать назначенные или отозванные привилегии, например, "WinMgmts:{(Shutdown, !RemoteShutdown)}" в нашем случае "WinMgmts:{(Shutdown)}"
2)Вы пытаететь работать с пространством имен по умолчанию, которое извлекается из подраздела HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\Scripting\Default Namespace. В нашем случае таким пространством является Root\CIMV2.
Тогда вот это:
set objWMIService = GetObject("winmgmts:" & "{impersonationLevel = impersonate}!\\.\root\cimv2") можно смело сократить до вот этого:
set objWMIService = GetObject("winmgmts:"),
т.к. ваш случай больше подходит для перезагрузки удаленных станций.
Я бы понял такой вариант:
objWMIService = GetObject("winmgmts:" & "{impersonationLevel = impersonate}!\\VPUPKIN_COMP\root\cimv2". Но зачем так много писать для локального компа?
3)ObjOperatingSystem.Win32Shutdown(1) выключит машину, а не перезагрузит/ Либо параметр (2) либо ObjOperatingSystem.Reboot()
Log Off - objOperatingSystem.Win32Shutdown(0)
Forced Log Off - objOperatingSystem.Win32Shutdown(0 + 4)
Shutdown - objOperatingSystem.Win32Shutdown(1)
Forced Shutdown - objOperatingSystem.Win32Shutdown(1 + 4)
Reboot - objOperatingSystem.Win32Shutdown(2)
Forced Reboot - objOperatingSystem.Win32Shutdown(2 + 4)
Power Off - objOperatingSystem.Win32Shutdown(8)
Forced Power Off - objOperatingSystem.Win32Shutdown(8 + 4)
4)Ваш вариант на Windows 7 вместо перезагрузки выдаст лаконичное "Privilege not Held"
Этот вариант будет работать и на семерке и на XP:
set objWMIService = GetObject("winmgmts:{(Shutdown)}")
set colSoftware = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
for each objSoftware in colSoftware
objSoftware.Win32Shutdown(2)
next
sc.septimus
(04.05.2012 в 09:11):
Вот еще варианты на VBS с запросом подтверждения выполнения действия
--------------------------------------------------------------
Message="Вы хотите заверить сеанс пользователя?"
YesNo = MsgBox(Message, vbYesNo)
If YesNo = vbYes Then
Set objWMIService = GetObject("winmgmts:{(Shutdown)}")
Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Win32Shutdown(0)
Next
End if
---------------------------------------------------------------
Message="Вы хотите выключить компьютер?"
YesNo = MsgBox(Message, vbYesNo)
If YesNo = vbYes Then
Set objWMIService = GetObject("winmgmts:{(Shutdown)}")
Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Win32Shutdown(1)
Next
End if
------------------------------------------------------------------
Message="Вы хотите перезагрузить компьютер?"
YesNo = MsgBox(Message, vbYesNo)
If YesNo = vbYes Then
Set objWMIService = GetObject("winmgmts:{(Shutdown)}")
Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Reboot()
Next
End If
--------------------------------------------------------------
Message="Вы хотите заверить сеанс пользователя?"
YesNo = MsgBox(Message, vbYesNo)
If YesNo = vbYes Then
Set objWMIService = GetObject("winmgmts:{(Shutdown)}")
Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Win32Shutdown(0)
Next
End if
---------------------------------------------------------------
Message="Вы хотите выключить компьютер?"
YesNo = MsgBox(Message, vbYesNo)
If YesNo = vbYes Then
Set objWMIService = GetObject("winmgmts:{(Shutdown)}")
Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Win32Shutdown(1)
Next
End if
------------------------------------------------------------------
Message="Вы хотите перезагрузить компьютер?"
YesNo = MsgBox(Message, vbYesNo)
If YesNo = vbYes Then
Set objWMIService = GetObject("winmgmts:{(Shutdown)}")
Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Reboot()
Next
End If
Віталій
(13.03.2012 в 18:36):
А как из командной строки под ХР запустить е-майл?
Win 98 было - start mailto:test@mail.ru?subject=трялялля
Win 98 было - start mailto:test@mail.ru?subject=трялялля
Сергей
(14.07.2011 в 23:42):
Спасибо, действительно нужная инфа. Вот только я пару лет назад озадачился этим же для Windows 98, хочу еще пару способов для Windows 98 указать, вдруг еще кому пригодится :) .
Перезагрузка RUNDLL32.EXE shell32.dll,SHExitWindowsEx 2
Выключение RUNDLL32.EXE shell32.dll,SHExitWindowsEx 1
И на VB script выключение
Dim objShell
set objShell = CreateObject("Shell.Application")
objShell.ShutdownWindows
set objShell = nothing
На 98й проверял, как на остальных работает, не знаю.
Перезагрузка RUNDLL32.EXE shell32.dll,SHExitWindowsEx 2
Выключение RUNDLL32.EXE shell32.dll,SHExitWindowsEx 1
И на VB script выключение
Dim objShell
set objShell = CreateObject("Shell.Application")
objShell.ShutdownWindows
set objShell = nothing
На 98й проверял, как на остальных работает, не знаю.
Isaev
(04.07.2011 в 14:04):
Познавательно!
Я кроме shutdown ничего не знал :)
Я кроме shutdown ничего не знал :)
voila
(03.07.2011 в 11:19):
Спасибо за описание, действительно может пригодиться.
Чаще всего для подобных вещей использую совершенно чудную NirCMD — http://www.nirsoft.net/utils/nircmd.html, удобнее всего ее привязать к Total Commander или подобному фм.
Чаще всего для подобных вещей использую совершенно чудную NirCMD — http://www.nirsoft.net/utils/nircmd.html, удобнее всего ее привязать к Total Commander или подобному фм.
Добавить комментарий
Заполните форму для добавления комментария