Повышение прав 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. После подтверждения новый процесс получает полные права. Основные шаги:

  1. Проверить текущие права через IsUserAnAdmin().
  2. Если прав нет - вызвать ShellExecuteW с флагом 'runas', указав текущий интерпретатор и аргументы.
  3. Завершить первоначальный процесс, чтобы избежать дублирования.

Возможные проблемы:

  • 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, затем скрипт выполняется с правами администратора.

Пояснение: простой способ для ручного запуска, не требующий программирования.

Запуск Python от имени администратора - comments

En
Python от имени администратора (python)