Как запустить python скрипт от имени системы Windows?
Есть клиент-серверное приложение, которое должно передавать данные вне зависимости входа в учетную запись (такое реализованно в litemanager server ). Пользователь не вошел в учетную запись, но программа уже работает и дает соединение. Хотелось бы такое же реализовать.
Отслеживать
2,305 2 2 золотых знака 10 10 серебряных знаков 38 38 бронзовых знаков
задан 3 июл 2020 в 20:52
71 7 7 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В зависимости от того, что делает скрипт, вы можете:
- упаковать его в сервис, который затем должен быть установлен
- добавьте его в реестр Windows (HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run)
- добавьте к нему ярлык в папку автозагрузки меню «Пуск» — его расположение может меняться в зависимости от версии ОС, но у установщиков всегда есть инструкция по установке ярлыка в эту папку
- используйте планировщик задач Windows, и тогда вы можете установить задачу для нескольких видов событий, включая вход в систему и запуск.
Фактическое решение зависит от ваших потребностей и от того, что на самом деле делает скрипт.
Некоторые заметки о различиях:
- Решение № 1 запускает скрипт с компьютера, а решение № 2 и № 3 запускают его, когда пользователь, установивший его, входит в систему.
- Также стоит отметить, что # 1 всегда запускает скрипт, в то время как # 2 и # 3 запускают скрипт только для определенного пользователя (я думаю, что если вы используете пользователя по умолчанию, то он будет запускаться для всех, но я не уверен в деталях).
- Решение № 2 немного более «скрыто» для пользователя, в то время как решение № 3 оставляет пользователю гораздо больше контроля в плане отключения автоматического запуска.
- Наконец, решение № 1 требует административных прав, в то время как два других могут быть выполнены любым пользователем.
- Решение № 4 — это то, что я обнаружил в последнее время, и оно очень простое. Единственная проблема, которую я заметил, состоит в том, что скрипт python вызовет появление небольшого командного окна.
Как видите, все сводится к тому, что вы хотите сделать; например, если это что-то только для ваших целей, я бы просто перетащил его в папку автозагрузки.
В любом случае, в последнее время я полагаюсь на решение № 4, как на самый быстрый и простой подход.
Статья Запускаем скрипт Python от имени администратора в Windows
Иногда, для того чтобы выполнить скрипт на Python нам нужны права администратора. В противном случае, никаких предупреждений от операционной системы вы не увидите, просто будет запрещен доступ на выполнение тех или иных действий. Как пример, могу привести изменение/создание ключа реестра в статье «Изменение MAC-адреса в Linux и Windows с помощью Python». И тогда нужно будет запустить все еще раз, но уже с правами администратора или суперпользователя в Linux.
А как бы сделать так, чтобы скрипт сам проверял, запущена ли оболочка командной строки от имени администратора или нет, и если нет, перезапускал бы скрипт, но уже в оболочке, запущенной с правами администратора?
Вот, что произойдет, если запустить скрипт из статьи указанной выше без прав администратора в Windows:
Запуск скрипта в Windows
Запуск скрипта в Linux
Для Windows есть довольно простое решение. Давайте рассмотрим его подробнее.
Для начала нам нужно будет импортировать несколько модулей:
import ctypes import sys import psutil
В том же случае, если интерпретатор заругается и скажет, что у вас не установлен модуль psutil, его надо установить с помощью команды:
pip install psutil
Теперь пишем код который выполнит проверку, запущена ли программа от имени админа или нет, как раз перед тем, как выполнять проверку на имя программы. В этом коде делается проверка, запущена ли оболочка с правами администратора. Если да, то проверка вернет True и запустить функция main(). В противном случае, перезапускается процесс с именем запускаемого файла и повышением прав до администратора. Если у вас не отключен UAC, то нужно будет подтвердить запуск.
if ctypes.windll.shell32.IsUserAnAdmin(): if __name__ == "__main__": main() else: ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
И все будет работать. Но, тут есть небольшой нюансик. Так как скрипт перезапускается, то остается открытым то окно из которого он запускался изначально. И это не есть хорошо. Можно его закрыть вручную, но если уж автоматизировать, то нужно двигаться дальше. После запука с правами админа нужно будет закрыть окно Командной строки или PowerShell, из которой и запускался изначально скрипт на Python.
Здесь нужно «прибить» сам процесс. И логичнее всего сделать это получив его PID. Собственно PID это идентификатор процесса и является уникальным номером, который присваивается процессу на этапе выполнения. Возникает вопрос, а как этот PID получить? И вот тут на помощь нам придет модуль psutil.
Давайте напишем небольшую функцию для примера, как работает код. Запускаем цикл, в котором пробегаемся по каждому экземпляру объекта созданного psutil и отфильтрованного по значениям pid и name. Где name, это имя запущенного процесса. Не заголовок программы, а именно имя процесса. Далее, в переменную sys_app получаем значение экземпляра с именем, которое обрезаем от лишних точек, так как имя процесса будет выглядеть, к примеру, «cmd.exe». Берем первый элемент получившегося списка и приводим его, на всякий случай к нижнему регистру.
Затем делаем проверку, является ли полученное имя процесса PowerShell или Командной строкой. Так же можно добавить и проверку на то, является ли процесс Windows Terminal. И если это так, запускается процесс в котором получаем pid запущенного приложения и с помощью функции terminate() его завершаем.
Если же запущенный процесс не подходит по нужные параметры, не делаем ничего и продолжаем выполнение цикла.
def printing(): print('Тут мы чего-то печатаем, якобы с правами админа.') for app in psutil.process_iter(['pid', 'name']): sys_app = app.info.get('name').split('.')[0].lower() if 'powershell' in sys_app or 'cmd' in sys_app: try: psutil.Process(app.info.get('pid')).terminate() break except: continue input()
Но, будьте внимательны. Данный код «прибьёт» первый процесс, который будет найден. То есть тот, что запущен позже всех. Если вы запустите скрипт в процессе, который был запущен ранее, то он «прибит» не будет. А если убрать прерывание break в цикле, в этом случае будут «прибиты» все процессы.
Вот полный код скрипта по перезапуску командной строки в режиме администратора. Еще раз хочу сказать, что данный скрипт работает только в Windows и его можно вставить в свою программу, в которой требуется повышение привилегий.
Код со скриптом перезапуска от имени админа
import ctypes import sys import psutil def printing(): print('Тут мы чего-то печатаем, якобы с правами админа.') for app in psutil.process_iter(['pid', 'name']): sys_app = app.info.get('name').split('.')[0].lower() if 'powershell' in sys_app or 'cmd' in sys_app: try: psutil.Process(app.info.get('pid')).terminate() break except: continue input() def main(): printing() if ctypes.windll.shell32.IsUserAnAdmin(): if __name__ == "__main__": main() else: ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
Для Linux же подобных решений я не нашел. Наткнулся не небольшой модуль elevate. Но, как по мне, он работает несколько кривовато. Слишком много нужно произвести действий для того, чтобы запустить программу с его использованием. Если интересно, то вот код для его запуска:
import os from elevate import elevate def is_root(): return os.getuid() == 0 print("before ", is_root()) elevate() print("after ", is_root())
Тут собственно проверяется, запущен ли терминал под пользователем или рутом. И если под пользователем, о чем и сообщает возвращаемый код, запускается модуль elevate. По сути, он запускает запрос пароля в графическом режиме. Впрочем, этот режим можно отключить. Но, тут есть одна проблемка. Или даже не одна. Под пользователем root нужного модуля не найдется, так как он не установлен. Дальше, даже если вы установите этот модуль, вас ждет разочарование, так как перезапустившись в терминале под рутом вы получите сообщение, что скрипт, который вы запускаете, не найдет. И да, он не будет найден, потому, что вы запускали его от другого пользователя. И он лежит в другом месте. В этом случае нужно будет запускать скрипт с указанием полного пути к скрипту. Что очень неудобно. Проще, как на мой взгляд, просто выполнить тогда повышение привилегий до рута с помощью sudo su, а дальше уж злодействовать как пожелаете.
Ну или есть еще одно решение. Можно установить terminator. Это оболочка, которая при запуске будет запрашивать у вас пароль суперпользователя. То есть, выполнять повышение привилегий. И уже в дальнейшем все команды будут от имени суперпользователя. Это, даже судя по его названию, эмулятор терминала суперпользователя.
запуск python скрипта в Windows
Linux тут при том что python скрипт писался под Linux.
Запускаю скрипт из cmd
python test.py -q 'тест'
все ОК. Запускаю скрипт из bat файла — какая хрень с кодировкой. WTF ?
Jopich1 ☆
09.10.18 13:52:36 MSK
cmd.exe работает в кодировке cp866, а твой скрипт в другой.
dimderbin ★
( 09.10.18 14:00:35 MSK )
Ответ на: комментарий от dimderbin 09.10.18 14:00:35 MSK
ну так как через cmd все ок. Через bat файл ( т е по идее через тот же cmd ) — кракозябры.
Jopich1 ☆
( 09.10.18 14:03:54 MSK ) автор топика
Ответ на: комментарий от Jopich1 09.10.18 14:03:54 MSK
Без «по идее», есть 1001 причина почему так и почему не так, но правильный ответ один — меняй кодировку файла и заголовок, если он был (а если нет, то добавляй).
# -*- coding: -*-
dimderbin ★
( 09.10.18 14:08:33 MSK )
Последнее исправление: dimderbin 09.10.18 14:10:13 MSK (всего исправлений: 1)
$ python -q 'ムひオム・・ Unknown option: -q usage: python [option] . [-c cmd | -m mod | file | -] [arg] . Try `python -h' for more information.
я проверил, можно сохранять в shift-jis и тогда работает
$ python -q '今日は' Unknown option: -q usage: python [option] . [-c cmd | -m mod | file | -] [arg] . Try `python -h' for more information.
Составление скрипта Python для запуска в соответствии с предписанным количеством раз
Как запланировать запуск скрипта Python в определенное время
Способ запланировать запуск скрипта Python зависит от вашей операционной системы. Ниже приведены основные шаги запуска на операционной системе Windows. Для получения дополнительной информации по работе с утилитой Назначенные задания обратитесь к Справке Windows. Для запуска на системах Unix и Linux см. запись man для cron или crontab .
Для получения информации о запуске скрипта или модели в определенное время, см. сообщение блога Планирование запуска скрипта или модели Python в определенное время.
Планировщик задач
- Откройте мастер Планировщика заданий (Task Scheduler).
- Для Windows 7
- Щелкните меню Windows Пуск , щелкните Панель управления > Администрирование и щелкните Планировщик задач .
Примечание:
Если Панель управления находится в режиме отображения ‘по категориям’, щелкните Система и безопасность , щелкните Администрирование , а затем — Планировщик задач .
- В меню Windows Пуск наведите курсор на Настройки , далее наведите курсор на Панель управления , затем щёлкните Система и обслуживание . Выберите пункт Инструменты администрирования и щелкните Запланировать задачи .
- В меню Windows Пуск щёлкните на Панель управления , затем дважды щёлкните значок Планировщик задач .
- Если панель управления переключена в представление категорий, щёлкните на Производительность и обслуживание и щёлкните Планировщик задач .
- В меню Windows Пуск щёлкните на Настройки , далее наведите курсор на Панель управления , затем щёлкните Планировщик задач .
