Запуск скомпилированного Python (py2exe) от имени администратора в Vista - PullRequest
8 голосов
/ 12 октября 2008

Возможно ли программно запустить скомпилированный Python (скомпилированный через py2exe) от имени администратора в Vista?

Еще несколько уточнений:
Я написал программу, которая изменяет файл хостов Windows (c: \ Windows \ system32 \ drivers \ etc \ hosts) в Vista, программа не запустится и завершится с ошибкой, за исключением случаев, когда вы щелкаете правой кнопкой мыши и запускаете от имени администратора, даже когда У пользователя есть права администратора, в отличие от XP, где он будет работать, если у пользователя есть права администратора, поэтому мне нужен способ повысить его до нужных прав программно.

Ответы [ 3 ]

36 голосов
/ 18 сентября 2009

Следуя примерам из Python2x\Lib\site-packages\py2exe\samples\user_access_control, просто добавьте uac_info="requireAdministrator" в консоль или в Windows dict:

windows = [{
    'script': "admin.py",
    'uac_info': "requireAdministrator",
},]
5 голосов
/ 12 октября 2008

Вы хотите сказать, что вы хотите, чтобы Windows запрашивала повышение прав при запуске вашей программы? Это контролируется путем добавления манифеста UAC к ресурсам EXE. Эта запись в блоге объясняет, как создать манифест и как скомпилировать его в файл .RES.

Я не знаю, какие возможности py2exe имеет для встраивания пользовательских файлов .RES, поэтому вам может понадобиться использовать инструмент MT.EXE из Platform SDK для встраивания манифеста в вашу программу. MT.EXE не нуждается в файлах .RES; он может объединить файл .manifest напрямую.

3 голосов
/ 13 октября 2008

После комментария Роджера Липскомба я использовал файл манифеста в py2exe без каких-либо реальных знаний о том, что я делал. Так что может работать:

# 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)],
                 }]
     )

Возможно, вам придется немного поиграться ...

...