2009-06-22 9 views
13

¿Hay alguna forma de plataforma cruzada para comprobar que mi script de Python se ejecuta con derechos de administrador? Desafortunadamente, os.getuid() es UNIX-only y no está disponible en Windows.¿Forma de plataforma cruzada para comprobar los derechos de administrador en una secuencia de comandos de Python en Windows?

+1

Soy un programador de Linux. ¿Qué es un "derecho de administrador"? Es un permiso? –

+0

permiso de root, igual a "sudo algo" – grigoryvp

+1

No parece que el concepto de "derecho de administrador" sea multiplataforma, entonces. No hay un paralelo trivial. –

Respuesta

32
import ctypes, os 
try: 
is_admin = os.getuid() == 0 
except AttributeError: 
is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0 

print is_admin 
+2

'os.geteuid()' podría ser útil si la secuencia de comandos es un archivo ejecutable setuid (es decir, la secuencia de comandos se convirtió en un ejecutable independiente, por ejemplo, utilizando PyInstaller o cx_Freeze y setuid flag se ha establecido). 'os.getuid() 'no funcionará en este caso. Ver [ejemplo] (https://gist.github.com/1361886). – jfs

+2

Esto no funciona en Cygwin Python. Estoy ejecutando Python 2.7.10 en Cygwin 64. os.getuid() devuelve 4875961 aunque estoy ejecutando 'como administrador'. Y el módulo ctypes no tiene 'windll'. –

+0

produce 'function 'IsUserAnAdmin' not found' en Windows XP –

4

Intente hacer todo lo que necesite para los derechos de administrador y verifique si falla.

Esto solo funcionará para algunas cosas, ¿qué estás tratando de hacer?

+0

Necesito instalar una fuente para todo el sistema, esto requiere derechos de administrador en Windows Vista +. – grigoryvp

+1

EAFP es generalmente el mejor pero a veces tienes que LBYL. Un programa al que llamo devuelve un error ambiguo si el usuario no es un administrador. Este error es el mismo que si el usuario proporcionara un argumento inválido al programa. –

+0

... y la predecible horrible falta de respuesta de EAFP tiene su horrible cabeza. En nuestro caso, nos gustaría evitar que nuestra aplicación se ejecute como superusuario, ya que hacerlo podría constituir un riesgo de seguridad y, en cualquier caso, * siempre * es lo que no debe hacerse. EAFP es de poca ayuda aquí. No hay una acción específica para prohibir, sino más bien toda la categoría de acciones * all * cuando se ejecuta como un usuario específico. –

3

Es mejor si comprueba qué plataforma ejecuta su secuencia de comandos (usando sys.platform) y realiza una prueba basada en eso, p. importe alguna función hasAdminRights desde otro módulo específico de la plataforma.

En Windows puede comprobar si Windows\System32 es escribible usando os.access, pero recuerde tratar de recuperar la ruta de la carpeta del "Windows" real del sistema, probablemente usando pywin32. No codificar uno.

+0

Tengo mucha curiosidad sobre una función hasAdminRights() de algún módulo específico de la plataforma :). Lamentablemente, google no puede responder el nombre de esa función. El sistema de prueba32 parece razonable, pero el código se verá como un truco crudo :(. – grigoryvp

+0

Disculpa, fue solo un ejemplo del nombre de una función. No creo que haya una mejor manera de hacerlo que verificar el tipo de plataforma. El método más adecuado sería tratar de elevar sus derechos con UAC en el momento en que desee instalar la fuente, porque no los necesita todo el tiempo. Por lo tanto, primero debe verificar si tiene derechos de administrador antes de Vista y fallar al inicio. Si es posterior a XP/2003, solo fallará si no puede elevar los derechos, ya que, por ejemplo, el usuario no desea dar permiso al UAC o no tiene la contraseña del administrador. – macbirdie

1

pertenencia al grupo Administrador (Dominio/local/Empresa) es una cosa ..

la adaptación de su aplicación a no utilizar privilegio manta y el establecimiento de los derechos de grano fino es una mejor opción sobre todo si se está utilizando la aplicación iinteractivamente

probando determinados privilegios con nombre (se_shutdown se_restore etc), los derechos de los archivos son una apuesta más rápida y más fácil de diagnosticar.

+0

Si el script ejecuta aplicaciones/scripts externos que están documentados como" use sudo ", es difícil adivinar qué derechos necesitan exactamente. – grigoryvp

1

Aquí es una función de utilidad que creé 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 
Cuestiones relacionadas