Request UAC elevation from within a Python script?
Запрашивать права доступа из скрипта Python?
Я хочу, чтобы мой скрипт Python копировал файлы в Vista. Когда я запускаю его из обычного cmd.exe окна, ошибок не генерируется, но файлы НЕ копируются. Если я запускаю cmd.exe "от имени администратора", а затем запускаю свой скрипт, он работает нормально.
Это имеет смысл, поскольку контроль учетных записей пользователей (UAC) обычно предотвращает многие действия с файловой системой.
Есть ли способ, которым я могу из скрипта Python вызвать запрос на повышение уровня UAC (те диалоги, в которых говорится что-то вроде "такому-то приложению нужен доступ администратора, это нормально?")
Если это невозможно, есть ли способ, которым мой скрипт может хотя бы определить, что он не повышен, чтобы он мог корректно завершиться сбоем?
Переведено автоматически
Ответ 1
По состоянию на 2017 год, простым способом добиться этого является следующий:
if is_admin(): # Code of your program here else: # Re-run the program with admin rights ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)
Если вы используете Python 2.x, то вам следует заменить последнюю строку на:
Также обратите внимание, что если вы преобразовали свой скрипт python в исполняемый файл (используя такие инструменты, как py2exe, cx_freeze, pyinstaller), то вам следует использовать sys.argv[1:] вместо sys.argv в четвертом параметре.
Вот некоторые из преимуществ:
Внешние библиотеки не требуются. Он использует только ctypes и sys из стандартной библиотеки.
Работает как на Python 2, так и на Python 3.
Нет необходимости изменять ресурсы файла или создавать файл манифеста.
Если вы не добавите код под инструкцией if / else, код никогда не будет выполнен дважды.
Вы можете получить возвращаемое значение вызова API в последней строке и предпринять действие, если оно завершится неудачей (код <= 32). Проверьте возможные возвращаемые значения здесь.
Вы можете изменить метод отображения созданного процесса, изменив шестой параметр.
Документация по базовому вызову ShellExecute находится здесь.
Ответ 2
Мне потребовалось некоторое время, чтобы заставить ответ dguaraglia работать, поэтому в интересах экономии времени других вот что я сделал для реализации этой идеи:
import os import sys import win32com.shell.shell as shell ASADMIN = 'asadmin'
Похоже, нет способа на некоторое время повысить права приложения для выполнения определенной задачи. Windows при запуске программы должна знать, требуются ли приложению определенные привилегии, и будет запрашивать у пользователя подтверждение, когда приложение выполняет какие-либо задачи, для которых требуются. эти привилегии. Это можно сделать двумя способами:
Напишите файл манифеста, который сообщает Windows, что приложению могут потребоваться некоторые привилегии
Запустите приложение с повышенными привилегиями из другой программы
В этих двухстатьях гораздо подробнее объясняется, как это работает.
Что бы я сделал, если вы не хотите писать неприятную оболочку ctypes для CreateElevatedProcess API, так это использовал трюк ShellExecuteEx, описанный в статье Code Project (Pywin32 поставляется с оболочкой для ShellExecute ). Как? Что-то вроде этого:
При запуске вашей программы она проверяет, есть ли у нее права администратора, если нет, она запускается сама, используя трюк ShellExecute, и немедленно завершает работу, если это так, она выполняет поставленную задачу.
Поскольку вы описываете свою программу как "скрипт", я полагаю, этого достаточно для ваших нужд.
Приветствия.
Ответ 4
Просто добавляю этот ответ на случай, если другие будут перенаправлены сюда поиском Google, как и я. Я использовал elevate модуль в моем скрипте Python, и скрипт выполнялся с правами администратора в Windows 10.