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?
risposta
import ctypes, os
try:
is_admin = os.getuid() == 0
except AttributeError:
is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
print is_admin
'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
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'. –
produce 'function 'IsUserAnAdmin' su windows xp –
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?
Ho bisogno di installare un font di sistema, questo richiede diritti di amministratore su Windows Vista +. – grigoryvp
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. –
... 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. –
È 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.
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
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
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.
Se lo script esegue app/script esterni documentati come" use sudo "è difficile indovinare di quali diritti hanno esattamente bisogno. – grigoryvp
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
- 1. Testare i diritti di amministrazione nello script PowerShell?
- 2. Esiste un modo per verificare i diritti di amministratore in Windows con Perl?
- 3. Aggiunta di manifest per richiesta di diritti di amministrazione
- 4. Creazione multipiattaforma sotto Windows targeting per Linux usando CMake
- 5. Esegui uno script python come servizio Windows
- 6. Elevazione ai diritti di amministrazione nell'applicazione Mac
- 7. Terminare uno script python da un altro script python
- 8. Come posso chiamare uno script python da uno script python
- 9. Esiste un modo multipiattaforma per aprire un browser di file in Python?
- 10. Un modo migliore per controllare i parametri?
- 11. libreria curses-like per l'app per console multipiattaforma in python
- 12. Come eseguire uno script python in background?
- 13. WIX Masterizza Bootstrapper che non richiede i diritti di amministrazione per il mio MSI
- 14. Libreria di notifica Python multipiattaforma
- 15. Qual è il modo più semplice per inserire uno script Python nella barra delle applicazioni (Windows)
- 16. Come posso installare i moduli Python in modo programmatico/tramite uno script Python?
- 17. Posso in qualche modo "compilare" uno script Python per funzionare su PC senza Python installato?
- 18. Utilizzo del sottoprocesso per eseguire lo script Python su Windows
- 19. Diritti di amministrazione del sistema richiesti per modificare i metadati di una pubblicazione?
- 20. La migliore pratica per scrivere i log in/var/log da uno script python?
- 21. C'è un modo per cambiare l'icona di una cartella di Windows usando uno script Perl?
- 22. Controllare se uno script php è ancora in esecuzione
- 23. Riavvio di uno script python autoaggiornato
- 24. SBT: modo multipiattaforma per impostare java.library.path?
- 25. Come posso archiviare i dati dell'applicazione desktop in modo multipiattaforma per Python?
- 26. C'è un modo per creare più trigger in uno script?
- 27. Script di installazione corretto per un piccolo programma Python (non modulo) sotto Linux
- 28. Esiste uno strumento per controllare uno script Perl per istruzioni sull'uso non necessarie?
- 29. Un modo semplice per lanciare gli script Python con il mouse in OS-X
- 30. Utilizzo di python shelve multipiattaforma
Sono un programmatore Linux. Cos'è un "admin right"? È un permesso? –
permesso root, uguale a "sudo qualcosa" – grigoryvp
Non sembra che il concetto di "admin right" sia multipiattaforma, quindi. Non c'è un parallelo banale. –