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.