¿Forma multiplataforma para verificar los derechos de administrador en un script de Python en Windows?
-
06-07-2019 - |
Pregunta
¿Hay alguna forma multiplataforma de verificar que mi script Python se ejecute con derechos de administrador? Desafortunadamente, os.getuid ()
es solo UNIX y no está disponible en Windows.
Solución
import ctypes, os
try:
is_admin = os.getuid() == 0
except AttributeError:
is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
print is_admin
Otros consejos
Intente hacer lo que sea necesario para los derechos de administrador y compruebe si hay errores.
Sin embargo, esto solo funcionará para algunas cosas, ¿qué estás tratando de hacer?
Es mejor si comprueba en qué plataforma se está ejecutando su script (usando sys.platform
) y realiza una prueba basada en eso, p. importe alguna función hasAdminRights desde otro módulo específico de plataforma.
En Windows, puede verificar si Windows \ System32
se puede escribir utilizando os.access
, pero recuerde intentar recuperar el " Windows " real del sistema ruta de carpeta, probablemente usando pywin32. No codifique uno.
La pertenencia al grupo de administradores (Dominio / Local / Empresa) es una cosa ...
adaptar su aplicación para que no use privilegios generales y establecer derechos específicos es una mejor opción, especialmente si la aplicación se usa de forma interactiva.
prueba de privilegios con nombre en particular (se_shutdown se_restore, etc.), los derechos de archivo son mejores y más fáciles de diagnosticar.
Aquí hay una función de utilidad que creé a partir de la respuesta aceptada:
import os
import ctypes
class AdminStateUnknownError(Exception):
"""Cannot determine whether the user is an admin."""
pass
def is_user_admin():
# type: () -> bool
"""Return True if user has admin privileges.
Raises:
AdminStateUnknownError if user privileges cannot be determined.
"""
try:
return os.getuid() == 0
except AttributeError:
pass
try:
return ctypes.windll.shell32.IsUserAnAdmin() == 1
except AttributeError:
raise AdminStateUnknownError