Question
Asked By – jwfearn
I want my Python script to copy files on Vista. When I run it from a normal cmd.exe
window, no errors are generated, yet the files are NOT copied. If I run cmd.exe
“as administator” and then run my script, it works fine.
This makes sense since User Account Control (UAC) normally prevents many file system actions.
Is there a way I can, from within a Python script, invoke a UAC elevation request (those dialogs that say something like “such and such app needs admin access, is this OK?”)
If that’s not possible, is there a way my script can at least detect that it is not elevated so it can fail gracefully?
Now we will see solution for issue: Request UAC elevation from within a Python script?
Answer
As of 2017, an easy method to achieve this is the following:
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)
If you are using Python 2.x, then you should replace the last line for:
ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(" ".join(sys.argv)), None, 1)
Also note that if you converted you python script into an executable file (using tools like py2exe
, cx_freeze
, pyinstaller
) then you should use sys.argv[1:]
instead of sys.argv
in the fourth parameter.
Some of the advantages here are:
- No external libraries required. It only uses
ctypes
andsys
from standard library. - Works on both Python 2 and Python 3.
- There is no need to modify the file resources nor creating a manifest file.
- If you don’t add code below if/else statement, the code won’t ever be executed twice.
- You can get the return value of the API call in the last line and take an action if it fails (code <= 32). Check possible return values here.
- You can change the display method of the spawned process modifying the sixth parameter.
Documentation for the underlying ShellExecute call is here.
This question is answered By – Martín De la Fuente
This answer is collected from stackoverflow and reviewed by FixPython community admins, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0