Повышение прав Python: варианты привилегированного запуска
Запуск Python от имени администратора
Наиболее эффективное решение для запуска Python скрипта с правами администратора в Windows - использование ShellExecuteW из библиотеки ctypes. Этот метод позволяет программно запросить повышение привилегий через UAC (User Account Control) без дополнительных утилит.
import ctypes, sys, os
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if is_admin():
print('Уже запущено от администратора')
# основной код
else:
# Запрашиваем повышение прав
ctypes.windll.shell32.ShellExecuteW(
None, 'runas', sys.executable, ' '.join(sys.argv), None, 1
)
Python от имени администратора (запуск python от имени администратора)
Если скрипт запущен без прав, он перезапускает себя с параметром runas, что вызывает диалог UAC. После подтверждения новый процесс получает полные права. Основные шаги:
- Проверить текущие права через IsUserAnAdmin().
- Если прав нет - вызвать ShellExecuteW с флагом 'runas', указав текущий интерпретатор и аргументы.
- Завершить первоначальный процесс, чтобы избежать дублирования.
Возможные проблемы:
- UAC может быть отключён - тогда права не повышаются. Решение: включить UAC или использовать альтернативные методы.
- Ошибка при передаче аргументов с пробелами - необходимо экранировать кавычки. Пример: sys.argv нужно корректно подготовить.
- Если скрипт запущен из консоли IDE (например, PyCharm), повышение может не сработать из-за особенностей окружения. Используйте терминал вне IDE.
Как запустить Python скрипт от имени администратора через командную строку?
Используйте команду runas:
runas /user:Администратор "python C:\script.py"Система запросит пароль учётной записи администратора. Этот метод не использует UAC, но требует знания пароля. Минус: пароль передаётся в открытом виде в истории команд. Для автоматизации лучше применять ShellExecuteW.
Ошибка 1327 - неверный диск или путь. Убедитесь, что путь к python и скрипту указаны верно, а диск доступен.
Как запустить Python от администратора через bat-файл?
Создайте script.bat:
@echo off
powershell -Command "Start-Process 'python' 'C:\script.py' -Verb RunAs"Файл вызывает PowerShell, который запускает python с повышенными правами. Удобно для ручного запуска. Недостаток: мелькание окна консоли.
Ошибка «Не удаётся найти файл» - укажите полный путь к python.exe или используйте %USERPROFILE%\AppData\Local\Programs\Python\Python312\python.exe.
Как использовать модуль elevate для повышения прав?
Установите библиотеку elevate (через pip install elevate) и добавьте вызов:
from elevate import elevate
def main():
print('Скрипт запущен с правами администратора')
if __name__ == '__main__':
elevate(main)Библиотека автоматически определяет необходимость повышения и перезапускает скрипт. Простота, но меньше контроля. При ошибке elevate может зависнуть, если UAC заблокирован групповой политикой.
ModuleNotFoundError - установите elevate: pip install elevate. Если нет доступа к pip под обычным пользователем, используйте --user.
Как запланировать запуск Python скрипта с максимальными привилегиями?
В планировщике задач Windows создайте задачу с опцией «Выполнять с наивысшими правами». Через PowerShell:
$action = New-ScheduledTaskAction -Execute 'python' -Argument 'C:\script.py'
$trigger = New-ScheduledTaskTrigger -Daily -At '10:00'
$principal = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName 'AdminPythonTask' -Action $action -Trigger $trigger -Principal $principalЗадача выполняется от имени SYSTEM без запроса UAC. Подходит для автоматизации. Требует прав на создание задач.
Ошибка «Недостаточно прав» - запустите PowerShell от администратора. Проверьте политику выполнения скриптов (Set-ExecutionPolicy RemoteSigned).
Как запустить Python от администратора через PowerShell?
Прямая команда в PowerShell:
Start-Process python -ArgumentList 'C:\script.py' -Verb RunAsПоявится диалог UAC. После подтверждения скрипт выполнится с правами администратора. Можно объединить с проверкой прав внутри скрипта.
Ошибка «Отказано в доступе» - убедитесь, что пользователь имеет права администратора. Для автоматизации без UAC используйте планировщик.
Расширенные примеры программного кода
Ниже приведены детальные примеры, иллюстрирующие различные сценарии запуска Python от имени администратора.
1. Самоповышение прав с проверкой и перезапуском
import ctypes, sys, os
def run_as_admin():
if ctypes.windll.shell32.IsUserAnAdmin():
return True
# Перезапуск с правами администратора
ctypes.windll.shell32.ShellExecuteW(
None, 'runas', sys.executable, ' '.join(sys.argv), None, 1
)
return False
if __name__ == '__main__':
if run_as_admin():
# Код, который требует прав администратора
print('Скрипт выполняется с привилегиями администратора')
input('Нажмите Enter для завершения...')
else:
# Первоначальный процесс завершаем
sys.exit(0)Вывод: после подтверждения UAC появляется новое окно с текстом «Скрипт выполняется с привилегиями администратора».
Пояснение: скрипт проверяет права. Если их нет, запускает себя с runas и завершается. Новый процесс содержит вызов IsUserAnAdmin() и выполняет основной код.
2. Запуск другого скрипта с правами администратора
import ctypes, sys
script_path = r'C:\scripts\admin_task.py'
ctypes.windll.shell32.ShellExecuteW(
None, 'runas', sys.executable, f'"{script_path}"', None, 1
)Результат: открывается консоль с UAC, затем выполняется admin_task.py с повышенными правами.
Пояснение: указывается полный путь к целевому скрипту. Кавычки обязательны, если путь содержит пробелы.
3. Использование модуля elevate с обработкой ошибок
try:
from elevate import elevate
def main():
import os
print(f'Текущий пользователь: {os.getenv("USERNAME")}')
print('Запущено с правами администратора')
if __name__ == '__main__':
elevate(main)
except ImportError:
print('Модуль elevate не установлен. Установите: pip install elevate')Вывод: при первом запуске появляется UAC, после подтверждения выводится имя пользователя и сообщение об админских правах.
Пояснение: модуль автоматически перезапускает скрипт. Обработка ImportError позволяет избежать краха, если библиотека отсутствует.
4. Создание задачи в планировщике через Python (с правами)
import subprocess, sys, os
def create_scheduled_task():
script = sys.argv[0] if not sys.argv[0].endswith('.py') else sys.argv[0]
cmd = f'''
powershell -Command "
$action = New-ScheduledTaskAction -Execute 'python' -Argument '{script}';
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1);
$principal = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -LogonType ServiceAccount -RunLevel Highest;
Register-ScheduledTask -TaskName 'TempAdminTask' -Action $action -Trigger $trigger -Principal $principal -Force;
Start-ScheduledTask -TaskName 'TempAdminTask';
"
'''
subprocess.run(cmd, shell=True)
if __name__ == '__main__':
# Проверка прав: если нет - создаём задачу
import ctypes
if not ctypes.windll.shell32.IsUserAnAdmin():
create_scheduled_task()
sys.exit(0)
print('Запущено от имени SYSTEM через планировщик')
input()Результат: через минуту скрипт выполняется от имени SYSTEM без UAC, вывод «Запущено от имени SYSTEM через планировщик».
Пояснение: скрипт сам создаёт разовую задачу, запускающую его же с наивысшими правами. Требует прав администратора для создания задачи – первоначально можно использовать один из предыдущих методов.
5. Запуск с правами через ярлык - настройка свойств
; Создаётся ярлык для python.exe с аргументом "C:\script.py"
; В свойствах ярлыка на вкладке "Ярлык" нажать "Дополнительно" и включить "Запуск от имени администратора"Результат: при двойном клике по ярлыку появляется UAC, затем скрипт выполняется с правами администратора.
Пояснение: простой способ для ручного запуска, не требующий программирования.