title: How to run a script with elevated privilege on windows?
body: <p>I've been trying to puzzle out how to run a bunch of applications which all require elevated permissions. Applications like DameWare, MSC.exe, PowerShell.exe, and the SCCM Manager Console, which are all used in my daily work routine.</p>
  
  <p>I am running Win7 right now, with plans to move to Win10 eventually. Every day I run these programs and it is time consuming to run them one by one and type in name/password for each. I figured I'd just 'automate the boring stuff' and let Python do it.</p>
  
  <p>Over on this question (<a href="https://stackoverflow.com/questions/19672352/how-to-run-python-script-with-elevated-privilege-on-windows">How to run python script with elevated privilege on windows</a>) the answer is there and the code for an old module called 'admin' was posted. However it was written in Python 2+ and doesn't work so well with Python 3.5+. I've done what I know to do with my limited python knowledge but I keep getting errors when it attempts to run</p>
  
  <pre class="lang-none prettyprint-override"><code>Traceback (most recent call last):
    File "&lt;pyshell#1&gt;", line 1, in &lt;module&gt;
      runAsAdmin('cmd.exe')
    File "I:\Scripting\Python\admin.py", line 41, in runAsAdmin
      elif type(cmdLine) not in (types.TupleType,types.ListType):
  AttributeError: module 'types' has no attribute 'TupleType'
  </code></pre>
  
  <p>I've done some research and all I can find is the Python 2 documentation or examples, but not a Python 3 conversion/equivalent.</p>
  
  <p>Here is the admin.py source, I've done what I can to bring it up to Python 3.5+. Any help you can offer will be appreciated!</p>
  
  <pre><code>#!/usr/bin/env python
  # -*- coding: utf-8; mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
  # vim: fileencoding=utf-8 tabstop=4 expandtab shiftwidth=4
  
  # (C) COPYRIGHT © Preston Landers 2010
  # Released under the same license as Python 2.6.5
  
  
  import sys, os, traceback, types
  
  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.")
  
      import win32api, win32con, win32event, win32process
      from win32com.shell.shell import ShellExecuteEx
      from win32com.shell import shellcon
  
      python_exe = sys.executable
  
      if cmdLine is None:
          cmdLine = [python_exe] + 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 = input('Press Enter to exit.')
      return rc
  
  
  if __name__ == "__main__":
      sys.exit(test())
  </code></pre>