A partire dal 2017, un metodo semplice per ottenere questo risultato è il seguente:
import ctypes, sys
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if is_admin():
# Code of your program here
else:
# Re-run the program with admin rights
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)
Se stai usando Python 2.x, dovresti sostituire l'ultima riga per:
ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(" ".join(sys.argv)), None, 1)
Si noti inoltre che se è stato convertito script Python in un file eseguibile (utilizzando strumenti come py2exe
, cx_freeze
, pyinstaller
), allora si dovrebbe usare sys.argv[1:]
al posto disys.argv
nel quarto parametro.
Alcuni dei vantaggi qui sono:
- Non sono richieste librerie esterne. Utilizza solo
ctypes
e sys
dalla libreria standard.
- Funziona sia su Python 2 che su Python 3.
- Non è necessario modificare le risorse del file né creare un file manifest.
- Se non aggiungi il codice sotto l'istruzione if / else, il codice non verrà mai eseguito due volte.
- È possibile ottenere il valore di ritorno della chiamata API nell'ultima riga ed eseguire un'azione se non riesce (codice <= 32). Controlla i possibili valori di ritorno qui .
- È possibile modificare il metodo di visualizzazione del processo generato modificando il sesto parametro.
La documentazione per la chiamata ShellExecute sottostante è disponibile qui .