Я пишу приложение pyqt, которое требует выполнения задачи администратора. Я бы предпочел начать свой сценарий с привилегий elevate. Я знаю, что этот вопрос задается много раз в том или ином форуме. Но решение люди предлагаю взглянуть на этот вопрос так запросить высоту UAC из скрипта Python?
однако, я не могу выполнить пример кода, приведенный в ссылке. Я положил этот код поверх основного файла и попытался выполнить его.
import os import sys import win32com.shell.shell as shell ASADMIN = ‘asadmin’ if sys.argv[-1] != ASADMIN: script = os.path.abspath(sys.argv[0]) params = ‘ ‘.join([script] + sys.argv[1:] + [ASADMIN]) shell.ShellExecuteEx(lpVerb=’runas’, lpFile=sys.executable, lpParameters=params) sys.exit(0) print «I am root now.»
он фактически запрашивает разрешение на повышение, но строка печати никогда не выполняется. Кто-то может помочь мне успешно запустить вышеуказанный код. Спасибо заранее.
автор: Community
7 ответов
спасибо всем за ответ. У меня есть мой сценарий, работающий с модулем/ сценарием, написанным Preston Landers еще в 2010 году. После двух дней просмотра в Интернете я мог найти сценарий, поскольку он был глубоко скрыт в списке рассылки pywin32. С помощью этого скрипта легче проверить, является ли пользователь администратором, а если нет, то попросите UAC / admin right.
Как выполнить Python код с правами Администратора?!
Он обеспечивает вывод в отдельных окнах, чтобы узнать, что делает код. Пример использования кода, также включенного в скрипт. В интересах всех, кто все ищут UAC на windows, посмотрите на этот код. Надеюсь, это поможет кому-то, кто ищет такое же решение. Его можно использовать примерно так из вашего основного скрипта: —
import admin if not admin.isUserAdmin(): admin.runAsAdmin()
автор: sundar_ima
в комментарии ответ вы взяли код из кто-то говорит ShellExecuteEx не отправляет свой STDOUT обратно в исходную оболочку. таким образом, вы не увидите «I am root now», хотя код, вероятно, работает нормально.
вместо того, чтобы печатать что-то, попробуйте записать в файл:
import os import sys import win32com.shell.shell as shell ASADMIN = ‘asadmin’ if sys.argv[-1] != ASADMIN: script = os.path.abspath(sys.argv[0]) params = ‘ ‘.join([script] + sys.argv[1:] + [ASADMIN]) shell.ShellExecuteEx(lpVerb=’runas’, lpFile=sys.executable, lpParameters=params) sys.exit(0) with open(«somefilename.txt», «w») as out: print >> out, «i am root»
а затем посмотрите в файле.
автор: andrew cooke
вот решение с перенаправлением stdout:
def elevate(): import ctypes, win32com.shell.shell, win32event, win32process outpath = r’%s%s.out’ % (os.environ[«TEMP»], os.path.basename(__file__)) if ctypes.windll.shell32.IsUserAnAdmin(): if os.path.isfile(outpath): sys.stderr = sys.stdout = open(outpath, ‘w’, 0) return with open(outpath, ‘w+’, 0) as outfile: hProc = win32com.shell.shell.ShellExecuteEx(lpFile=sys.executable, lpVerb=’runas’, lpParameters=’ ‘.join(sys.argv), fMask=64, nShow=0)[‘hProcess’] while True: hr = win32event.WaitForSingleObject(hProc, 40) while True: line = outfile.readline() if not line: break sys.stdout.write(line) if hr != 0x102: break os.remove(outpath) sys.stderr = » sys.exit(win32process.GetExitCodeProcess(hProc)) if __name__ == ‘__main__’: elevate() main()
автор: Florent B.
вот решение, которое требовало только модуля ctypes. Поддержка pyinstaller обернутой программы.
Нужны админские права? Получаем или включаем СУПЕРАДМИНА!
#!python # coding: utf-8 import sys import ctypes def run_as_admin(argv=None, debug=False): shell32 = ctypes.windll.shell32 if argv is None and shell32.IsUserAnAdmin(): return True if argv is None: argv = sys.argv if hasattr(sys, ‘_MEIPASS’): # Support pyinstaller wrapped program. arguments = map(unicode, argv[1:]) else: arguments = map(unicode, argv) argument_line = u’ ‘.join(arguments) executable = unicode(sys.executable) if debug: print ‘Command line: ‘, executable, argument_line ret = shell32.ShellExecuteW(None, u»runas», executable, argument_line, None, 1) if int(ret)
автор: Gary Lee
Я нашел очень простое решение этой проблемы.
- создать ярлык для python.exe
- измените цель ярлыка на что-то вроде C:xxx. python.exe your_script.py
- нажмите » advance. «в панели свойств ярлыка и нажмите опцию «Запуск от имени администратора»
Я не уверен, что заклинания этих параметров верны, так как я использую китайскую версию Windows.
автор: delphifirst
Я могу подтвердить, что решение delphifirst работает и является самым простым и простым решением проблемы запуска скрипта python с повышенными привилегиями.
Я создал ярлык для исполняемого файла python (python.exe), а затем изменил ярлык, добавив имя моего скрипта после вызова python.исполняемый. Далее я проверил «Запуск от имени администратора» на вкладке «Совместимость» ярлыка. Когда ярлык выполняется, появляется запрос разрешения на запуск сценария в качестве администратора.
мое конкретное приложение python было программой установки. Программа позволяет устанавливать и удалять другое приложение python. В моем случае я создал два ярлыка, один с именем «appname install», а другой с именем»appname uninstall». Единственное различие между двумя ярлыками-это аргумент, следующий за именем скрипта python. В версии установщика аргументом является «install».
В удалить версию аргумент «удалить». Код в установщике скрипт оценивает предоставленный аргумент и при необходимости вызывает соответствующую функцию (install или uninstall).
Я надеюсь, что мое объяснение поможет другим быстрее разобраться, как запустить скрипт Python с повышенными привилегиями.
автор: John Moore
также, если ваш рабочий каталог отличается от lpDirectory
procInfo = ShellExecuteEx(nShow=showCmd, lpVerb=lpVerb, lpFile=cmd, lpDirectory= unicode(direc), lpParameters=params)
пригодится, если изменение пути не является желательным вариантом удалите unicode для python 3.X
Источник: askdev.ru
Как запустить скрипт Python от имени администратора
Я использую скрипт python и модуль win32serviceutil, чтобы останавливать и запускать службы Windows. Я член группы «локальные администраторы». Я вхожу в систему как этот участник и запускаю сценарий, но получаю сообщение об ошибке: Доступ запрещен. Если я запускаю командную строку от имени администратора и запускаю из этого окна, все работает нормально. Мой вопрос: как внутри скрипта я мог указать запускать его от имени администратора? (примечание: я не знаю пароль администратора) Спасибо
person susja schedule 17.12.2014 source источник
Это может помочь ››› stackoverflow.com/questions/19672352/ — person Syed Mauze Rehan nbsp schedule 17.12.2014
Я решил свою проблему, изучив одну из тем на stackoverflow.com. Было предложено использовать пакетный файл, который будет вызывать скрипт python, а поверх этого пакета использовать команду PowerShell для повышения привилегий. У меня это сработало. Билет мог быть закрыт — person susja 17.12.2014
Источник: questu.ru
Как я могу запустить код Python с правами администратора
Я хочу скопировать и перенести некоторые файлы с моего компьютера на USB, но при запуске он говорит:
WindowsError: [Error 5] Access denied: ‘F:\’
Как я могу использовать права администратора в Python, чтобы избежать этой ошибки. Также вот код:
import os import shutil from os import walk ruta=’C:\’ final=’F:\’ for (path,ficheros,archivos) in walk(ruta): for i in archivos: shutil.copytree(ruta,final) for i in ficheros: shutil.copytree(ruta,final)
user5216052 04 сен ’15 в 14:09 2015-09-04 14:09
2015-09-04 14:09
2 ответа
Самое простое решение — просто запустить процесс Python от имени администратора. В зависимости от того, как вы запускаете скрипт, есть разные способы сделать это.
Самое простое решение — просто запустить консоль от имени администратора и затем запустить команду Python оттуда.
Если вы хотите, чтобы что-то дважды щелкнуло, вы также можете создать ярлык и запустить его, выбрав «Запуск от имени администратора» в контекстном меню (меню правой кнопки мыши).
В противном случае вы могли бы также заставить скрипт запрашивать повышенные разрешения некоторым не таким простым способом.
user216074 04 сен ’15 в 14:34 2015-09-04 14:34
2015-09-04 14:34
Некоторые моменты, на которые следует обратить внимание:
- shutil.copytree() уже сделает рекурсивную копию файла. Там нет необходимости использовать os.walk чтобы получить каждый отдельный файл. Следующее было бы всем, что было необходимо: shutil.copytree(‘C:\’, ‘F:\’)
- Пытаясь скопировать весь ваш C: Возможно, в какой-то момент диск на USB-накопителе выйдет из строя, так как некоторые файлы и папки не будут скопированы. Было бы лучше выбрать определенные папки.
- Вы получите Access denied ошибка, если вы попытаетесь выбрать корневую папку на USB-накопителе. Также вам нужно убедиться, что целевой каталог не существует. Попробуйте следующее: shutil.copytree(‘C:\’, ‘F:\c_drive’)
- Наконец, создание полной копии, как это, вероятно, займет много времени, и не будет никакой обратной связи относительно того, как быстро это продвигается. Ваша идея использовать os.walk бы решить эту проблему, позволив вам просто скопировать файл за раз, но код необходимо исправить.
Источник: stackru.com