Modo multipiattaforma per verificare i diritti di amministratore in uno script Python in Windows?

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

  •  06-07-2019
  •  | 
  •  

Domanda

Esiste un modo multipiattaforma per verificare che il mio script Python sia eseguito con diritti di amministratore? Sfortunatamente, os.getuid () è solo UNIX e non è disponibile in Windows.

È stato utile?

Soluzione

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

print is_admin

Altri suggerimenti

Prova a fare tutto ciò di cui hai bisogno per avere i diritti di amministratore e controlla se ci sono errori.

Questo funzionerà solo per alcune cose, cosa stai cercando di fare?

È meglio se controlli quale piattaforma è in esecuzione il tuo script (usando sys.platform ) e fai un test basato su quello, ad es. importa alcune funzioni hasAdminRights da un altro modulo specifico della piattaforma.

Su Windows puoi verificare se Windows \ System32 è scrivibile usando os.access , ma ricorda di provare a recuperare l'effettiva "Windows" del sistema; percorso della cartella, probabilmente usando pywin32. Non codificarne uno.

L'appartenenza al gruppo di amministratori (dominio / locale / impresa) è una cosa ..

personalizzare l'applicazione in modo da non utilizzare il privilegio generale e impostare diritti a grana fine è un'opzione migliore soprattutto se l'app viene utilizzata in modo interattivo.

test per particolari privilegi nominati (se_shutdown se_restore ecc.), i diritti sui file sono una scommessa migliore e più facili da diagnosticare.

Ecco una funzione di utilità che ho creato dalla risposta accettata:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top