Apagar y reiniciar el sistema con la API de Windows

Apagar y reiniciar el sistema con la API de Windows

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:

py -m pip install pywin32

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.

Deja una respuesta