2009-06-22 11 views
13

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.Un modo multipiattaforma per controllare i diritti di amministrazione in uno script Python sotto Windows?

+1

Sono un programmatore Linux. Cos'è un "admin right"? È un permesso? –

+0

permesso root, uguale a "sudo qualcosa" – grigoryvp

+1

Non sembra che il concetto di "admin right" sia multipiattaforma, quindi. Non c'è un parallelo banale. –

risposta

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()' potrebbe essere utile se lo script è un eseguibile setuid (cioè, lo script è stato convertito in un eseguibile autonomo, ad es. usando PyInstaller o cx_Freeze e il flag setuid è stato impostato).getuid() 'non funzionerà in questo caso. Vedi [esempio] (https://gist.github.com/1361886). – jfs

+2

Questo non funziona con Cygwin Python. Sto eseguendo Python 2.7.10 su Cygwin 64. os.getuid() restituisce 4875961 anche se sto eseguendo 'come amministratore'. E il modulo ctypes non ha 'windll'. –

+0

produce 'function 'IsUserAnAdmin' su windows xp –

4

Provare a fare tutto ciò di cui si ha bisogno per i diritti di amministratore e controllare se si è verificato un errore.

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

+0

Ho bisogno di installare un font di sistema, questo richiede diritti di amministratore su Windows Vista +. – grigoryvp

+1

EAFP è solitamente il migliore, ma a volte è necessario LBYL. Un programma che chiamo restituisce un errore ambiguo se l'utente non è un amministratore. Questo errore equivale a se l'utente ha fornito un argomento non valido al programma. –

+0

... e la non-prevedibile EAFP non-risposta alza la sua brutta testa. Nel nostro caso, vorremmo impedire che la nostra applicazione venga eseguita come superutente, poiché ciò potrebbe costituire un rischio per la sicurezza e, in ogni caso, è * sempre * la cosa sbagliata da fare. EAFP è poco o nessun aiuto qui. Non esiste alcuna azione specifica da vietare, ma piuttosto l'intera categoria di * tutte * le azioni quando viene eseguito come utente specifico. –

3

È meglio controllare quale piattaforma è in esecuzione lo script (utilizzando sys.platform) ed eseguire un test basato su tale, ad es. importare alcune funzioni hasAdminRights da un altro modulo specifico della piattaforma.

Su Windows è possibile verificare se Windows\System32 è scrivibile utilizzando os.access, ma ricordarsi di provare a recuperare il percorso della cartella "Windows" effettivo del sistema, probabilmente utilizzando pywin32. Non inserire hardcode.

+0

Sono molto curioso riguardo a una funzione hasAdminRights() di alcuni moduli specifici della piattaforma :). Purtroppo, Google non può rispondere al nome di tale funzione. Test system32 sembra ragionevole, ma il codice sembrerà un rozzo mod :(. – grigoryvp

+0

Mi spiace, era solo un esempio di nome di una funzione. Non penso che ci sia un modo migliore per farlo che controllare il tipo di piattaforma. il metodo più corretto sarebbe cercare di elevare i tuoi diritti con UAC nel momento in cui desideri installare il font, perché non ne hai sempre bisogno. Quindi prima dovresti controllare se hai diritti di amministratore su pre-Vista e fallire all'avvio Se è post XP/2003, fallire solo se non è possibile elevare i diritti, poiché ad es. l'utente non ha voluto dare il permesso a UAC o non ha la password di amministratore. – macbirdie

1

appartenenza al gruppo Administrator (Domain/Local/Enterprise) è una cosa ..

sartoria l'applicazione non utilizzare a privilegiare una coperta e l'impostazione dei diritti grana fine è una scelta migliore, soprattutto se si utilizza l'applicazione iinteractively.

test per determinati privilegi denominati (se_shutdown se_restore ecc.), I diritti di file sono una scommessa migliore e più facile da diagnosticare.

+0

Se lo script esegue app/script esterni documentati come" use sudo "è difficile indovinare di quali diritti hanno esattamente bisogno. – grigoryvp

1

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 
Problemi correlati