-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
139 additions
and
30 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
#!/usr/bin/env python | ||
# -*- coding: utf-8 | ||
|
||
# (C) COPYRIGHT © Preston Landers 2010 | ||
# Released under the same license as Python 2.6.5 | ||
|
||
|
||
import sys | ||
import os | ||
import traceback | ||
import types | ||
|
||
import win32api | ||
import win32con | ||
import win32event | ||
import win32process | ||
|
||
from win32com.shell.shell import ShellExecuteEx | ||
from win32com.shell import shellcon | ||
|
||
|
||
def isUserAdmin(): | ||
|
||
if os.name == 'nt': | ||
import ctypes | ||
# WARNING: requires Windows XP SP2 or higher! | ||
try: | ||
return ctypes.windll.shell32.IsUserAnAdmin() | ||
except: | ||
traceback.print_exc() | ||
print "Admin check failed, assuming not an admin." | ||
return False | ||
elif os.name == 'posix': | ||
# Check for root on Posix | ||
return os.getuid() == 0 | ||
else: | ||
raise RuntimeError, "Unsupported operating system for this module: %s" % (os.name,) | ||
|
||
|
||
def runAsAdmin(cmdLine=None, wait=True): | ||
|
||
if os.name != 'nt': | ||
raise RuntimeError, "This function is only implemented on Windows." | ||
|
||
python_exe = sys.executable | ||
|
||
if cmdLine is None: | ||
# cmdLine = [python_exe] + sys.argv | ||
cmdLine = sys.argv | ||
elif type(cmdLine) not in (types.TupleType, types.ListType): | ||
raise ValueError("cmdLine is not a sequence.") | ||
|
||
cmd = '"%s"' % (cmdLine[0],) | ||
# XXX TODO: isn't there a function or something we can call to massage command line params? | ||
params = " ".join(['"%s"' % (x,) for x in cmdLine[1:]]) | ||
cmdDir = '' | ||
showCmd = win32con.SW_SHOWNORMAL | ||
#showCmd = win32con.SW_HIDE | ||
lpVerb = 'runas' # causes UAC elevation prompt. | ||
|
||
# print "Running", cmd, params | ||
|
||
# ShellExecute() doesn't seem to allow us to fetch the PID or handle | ||
# of the process, so we can't get anything useful from it. Therefore | ||
# the more complex ShellExecuteEx() must be used. | ||
|
||
# procHandle = win32api.ShellExecute(0, lpVerb, cmd, params, cmdDir, showCmd) | ||
|
||
procInfo = ShellExecuteEx(nShow=showCmd, | ||
fMask=shellcon.SEE_MASK_NOCLOSEPROCESS, | ||
lpVerb=lpVerb, | ||
lpFile=cmd, | ||
lpParameters=params) | ||
|
||
if wait: | ||
procHandle = procInfo['hProcess'] | ||
obj = win32event.WaitForSingleObject(procHandle, win32event.INFINITE) | ||
rc = win32process.GetExitCodeProcess(procHandle) | ||
#print "Process handle %s returned code %s" % (procHandle, rc) | ||
else: | ||
rc = None | ||
|
||
return rc | ||
|
||
|
||
def test(): | ||
rc = 0 | ||
if not isUserAdmin(): | ||
print "You're not an admin.", os.getpid(), "params: ", sys.argv | ||
#rc = runAsAdmin(["c:\\Windows\\notepad.exe"]) | ||
rc = runAsAdmin() | ||
else: | ||
print "You are an admin!", os.getpid(), "params: ", sys.argv | ||
rc = 0 | ||
x = raw_input('Press Enter to exit.') | ||
return rc | ||
|
||
|
||
if __name__ == "__main__": | ||
sys.exit(test()) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters