La función ExitWindowsEx() de la API de Windows permite que una aplicación apague o reinicie el sistema. En Python podemos interactuar con ella a través del paquete pywin32. Sin embargo, el proceso que invoca a la función debe tener un privilegio especial para poder ejecutar la operación; de lo contrario, fallará con un error de permisos, incluso cuando el programa fuera ejecutado como administrador. Por esta razón es necesario llamar a la función AdjustTokenPrivileges() para cambiar los privilegios de nuestro proceso antes de apagar o reiniciar el sistema.
He aquí el código:
from win32api import CloseHandle, ExitWindowsEx, GetCurrentProcess
from win32con import (
EWX_SHUTDOWN,
TOKEN_ADJUST_PRIVILEGES,
TOKEN_QUERY
)
from win32security import (
AdjustTokenPrivileges,
LookupPrivilegeValue,
OpenProcessToken,
SE_PRIVILEGE_ENABLED,
SE_SHUTDOWN_NAME
)
privilege_id = LookupPrivilegeValue(None, SE_SHUTDOWN_NAME)
process_handle = GetCurrentProcess()
process_token = OpenProcessToken(
process_handle,
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
)
if process_token is None:
print("No se ha podido obtener el token de acceso al proceso.")
exit()
AdjustTokenPrivileges(
process_token,
False,
((privilege_id, SE_PRIVILEGE_ENABLED),)
)
ExitWindowsEx(EWX_SHUTDOWN, 0)
CloseHandle(process_token)
from win32api import CloseHandle, ExitWindowsEx, GetCurrentProcess
from win32con import (
EWX_REBOOT,
TOKEN_ADJUST_PRIVILEGES,
TOKEN_QUERY
)
from win32security import (
AdjustTokenPrivileges,
LookupPrivilegeValue,
OpenProcessToken,
SE_PRIVILEGE_ENABLED,
SE_SHUTDOWN_NAME
)
privilege_id = LookupPrivilegeValue(None, SE_SHUTDOWN_NAME)
process_handle = GetCurrentProcess()
process_token = OpenProcessToken(
process_handle,
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
)
if process_token is None:
print("No se ha podido obtener el token de acceso al proceso.")
exit()
AdjustTokenPrivileges(
process_token,
False,
((privilege_id, SE_PRIVILEGE_ENABLED),)
)
ExitWindowsEx(EWX_REBOOT, 0)
CloseHandle(process_token)
Recuérdese instalar pywin32 ejecutando en la terminal:
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.