Modo multipiattaforma per verificare i diritti di amministratore in uno script Python in Windows?
-
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.
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