Как перезагрузить локальный или сетевой компьютер в Windows с Python

Спросите у гика, как решить проблему с вашим компьютером с Windows, и он, скорее всего, спросит: «Вы пытались перезагрузить его?». Это похоже на легкомысленный ответ, но перезагрузка компьютера может решить многие проблемы.

Как бы то ни было, у вас могут быть свои собственные причины для перезагрузки компьютера, в этой статье мы покажем вам, как перезагрузить его с помощью Python.

Требования

  • pywin32 установлен на машине исполнения.

В противном случае вы получите следующую ошибку в вашем скрипте:

ImportError: no module named win32api

Чтобы установить pywin32 на ваши окна, перейдите в репозиторий сборки в Source Forge здесь. Выберите последнюю сборку в списке (до даты этой статьи 220), тогда будет показан список раздач: x86 или x64

Pywin32 исходные кузнечные дистрибутивы

Установите дистрибутив, который работает с вашей версией python и платформы Windows (x86 или x64).

Перезапуск

Возможно, вы нашли некоторые решения, использующие модуль os и выполняющие модуль системной оболочки, известную команду shutdown:

import os
os.system("shutdown \r")

Однако для некоторых пользователей Windows это решение не работает правильно.

Чтобы предотвратить любую несовместимость, мы будем работать напрямую с win32api, что позволит нам достичь нашей цели.

Как указано в требованиях, на вашем компьютере должен быть установлен pywin32, чтобы избежать ошибок при выполнении.

Теперь следующий код предоставляет все, что вам нужно, чтобы иметь возможность перезагрузить компьютер (и прервать его, если вам нужно), используя python:

# reboot.py
import win32security
import win32api
import sys
import time
from ntsecuritycon import *
def AdjustPrivilege(priv, enable=1):
# Get the process token
flags = TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
htoken = win32security.OpenProcessToken(win32api.GetCurrentProcess(), flags)
# Get the ID for the system shutdown privilege.
idd = win32security.LookupPrivilegeValue(None, priv)
# Now obtain the privilege for this process.
# Create a list of the privileges to be added.
if enable:
newPrivileges = [(idd, SE_PRIVILEGE_ENABLED)]
else:
newPrivileges = [(idd, 0)]
# and make the adjustment
win32security.AdjustTokenPrivileges(htoken, 0, newPrivileges)
def RebootServer(user=None,message='Rebooting', timeout=30, bForce=0, bReboot=1):
AdjustPrivilege(SE_SHUTDOWN_NAME)
try:
win32api.InitiateSystemShutdown(user, message, timeout, bForce, bReboot)
finally:
# Now we remove the privilege we just added.
AdjustPrivilege(SE_SHUTDOWN_NAME, 0)
def AbortReboot():
AdjustPrivilege(SE_SHUTDOWN_NAME)
try:
win32api.AbortSystemShutdown(None)
finally:
AdjustPrivilege(SE_SHUTDOWN_NAME, 0)

2 основные функции будут RebootServer а также AbortReboot, AdjustPrivilege предоставит необходимые разрешения для перезагрузки системы. Обратите внимание, что RebootServer функция имеет время ожидания 30 секунд (компьютер будет перезагружен через 30 секунд), при необходимости измените его.

Чтобы перезагрузить компьютер (или сетевые компьютеры), используйте функцию RebootServer:

# Restart this PC (actual, as first parameter doesn't exist)
RebootServer()
# Restart the network PC named "Terminator" or the direct IP to restart it
RebootServer("Terminator")
# Restart this PC (actual) with all parameters :
# User: None
# Message
# Time in seconds
# Force restart
# restart immediately after shutting down
# Read more about the InitiateSystemShutdown function here : https://msdn.microsoft.com/en-us/library/windows/desktop/aa376873(v=vs.85).aspx
RebootServer(None,"Be careful, the computer will be restarted in 30 seconds",30,0,1)

Перезагрузка диалоговых окон

(Перезапуск предупреждения и перезагрузка прерванных сообщений)

Вы можете протестировать на более динамичном примере, выполнив следующий код:

  1. Перезапустите его через 30 секунд.
  2. Подождите 10 секунд.
  3. Прервите перезагрузку через 10 секунд.
# Reboot computer
RebootServer()
# Wait 10 seconds
time.sleep(10)
print ('Aborting shutdown')
# Abort shutdown before its execution
AbortReboot()

Поскольку код говорит сам за себя, теперь продолжайте работать в своем проекте, получайте удовольствие!

Ссылка на основную публикацию
Adblock
detector