8

Is it possible to programaticly run compiled Python (comiled via py2exe) as administrator in Vista?

Some more clarification:
I have written a program that modifies the windows hosts file (c:\Windows\system32\drivers\etc\hosts) in Vista the program will not run and will fail with an exception unless you right-click and run as administrator even when the user has administrator privileges, unlike in XP where it will run if the user has administration rights, so I need a way to elevate it to the correct privileges programaticly.

UnkwnTech
  • 88,102
  • 65
  • 184
  • 229

4 Answers4

38

Following the examples from Python2x\Lib\site-packages\py2exe\samples\user_access_control just add uac_info="requireAdministrator" to console or windows dict:

windows = [{
    'script': "admin.py",
    'uac_info': "requireAdministrator",
},]
sth
  • 222,467
  • 53
  • 283
  • 367
Ivaylo
  • 381
  • 3
  • 2
5

Do you mean that you want Windows to prompt for elevation when your program is run? This is controlled by adding a UAC manifest to the EXE's resources. This blog entry explains how to create the manifest and how to compile it into a .RES file.

I don't know what facilities py2exe has for embedding custom .RES files, so you might need to use the MT.EXE tool from the Platform SDK to embed the manifest in your program. MT.EXE doesn't need .RES files; it can merge the .manifest file directly.

Roger Lipscombe
  • 89,048
  • 55
  • 235
  • 380
3

Following up Roger Lipscombe's comment, I've used a manifest file in py2exe without any real knowledge of what I was doing. So this might work:

# in setup.py
# manifest copied from http://blogs.msdn.com/shawnfa/archive/2006/04/06/568563.aspx
manifest = '''
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
       <asmv3:trustInfo xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
         <asmv3:security>
           <asmv3:requestedPrivileges>
             <asmv3:requestedExecutionLevel
               level="asInvoker"
               uiAccess="false" />
           </asmv3:requestedPrivileges>
         </asmv3:security>
       </asmv3:trustInfo>
     </assembly>
'''

setup(name='MyApp',
      #...
      windows=[ { #...
                  'other_resources':[(24, 1, manifest)],
                 }]
     )

You may need to do some fiddling though..

John Fouhy
  • 41,203
  • 19
  • 62
  • 77
0

The best solution for pyinstaller is found here: Request UAC elevation from within a Python script?

No amount of manipulation of exe manifest file will work. Handle uac from within python code using if else statement