¿Forma multiplataforma para verificar los derechos de administrador en un script de Python en Windows?

StackOverflow https://stackoverflow.com/questions/1026431

  •  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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top