Windows служба, выполняющая пакетный скрипт как новый процесс [Python] - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть windows сервис, написанный на python, который работает с правами администратора и связывается с удаленным сервером для получения командного файла. Когда пакетный скрипт загружен, служба windows должна его выполнить. Однако служба получает ошибку при выполнении командного файла. Пакетный файл довольно прост, но я даже сократил его до минимума, где просто копирует файл из одного местоположения в дереве папок службы в другое местоположение под ним.

Я пытался выполнить пакетный скрипт но я получаю ошибку. Это то, что я пробовал до сих пор. - os.system () - subprocess.popen () - вариант подпроцесса, такой как subprocess.check_output () и subprocess.check_call ()] с необходимыми изменениями в пакетном файле

Однако, если я выполню ту же команду копирования файла (из пакетного файла) напрямую (с использованием библиотеки shutil) без вызова os.system () или subprocess.xxx (), копирование файла завершается успешно. Это заставляет меня думать, что существуют некоторые ограничения безопасности для процессов, которые создаются в службе windows в административном режиме.

Важно, чтобы я выполнил пакетный файл, загруженный с сервера, чтобы сервер имел полный контроль по поводу того, что служба делает после контакта с сервером.

Я пытаюсь это сделать на Windows 10, и она должна работать как минимум на win10. Я не пробовал в неадминистративном режиме, но служба все равно должна работать в режиме администратора.

Чего мне не хватает и как я могу это исправить.

РЕДАКТИРОВАТЬ: Вот некоторые пояснения , Служба Windows работает как оболочка для нескольких исполняемых файлов. Эти исполняемые файлы (часть пакетов) запускаются как отдельные подчиненные процессы для выполнения определенной задачи после их запуска службой.

Одна из задач, выполняемых этой службой, заключается в проверке на удаленном сервере наличия обновленных подчиненных исполняемых файлов и, если доступно, загрузите его, остановите исполняемый файл подчиненного устройства, скопируйте его, установите местоположение и перезапустите подчиненный процесс.

Вот отредактированное содержимое простого сценария bat [slave_upgrade.bat], который служба вызывает после того, как она загрузила обновленный образец slave exe в папке «Downloads».

COPY /Y "C:\Program Files\MyServiceFolder\Downloads\NewSlaveProgram.exe" "C:\Program Files\MyServiceFolder"

После загрузки и остановки процесса slave я вызываю slave_upgrade.bat с помощью os.system ()

rc = os.system("C:\Program Files\MyServiceFolder\slave_upgrade.bat")

Это возвращает r c = 1.

Если я пытаюсь вызвать скрипт bat с использованием подпроцесса,

proc = subprocess.Popen("C:\Program Files\MyServiceFolder\slave_upgrade.bat")

if proc != None:
    while True:
        if proc.poll() == None:
            time.sleep(1)
        else:
            break
    rc = proc.returncode

Это также возвращает r c = 1.

Если я попытаюсь использовать подпроцесс check_output (хотя в этой отредактированной версии нет выходных данных)

output = subprocess.check_output("C:\Program Files\MyServiceFolder\slave_upgrade.bat")

Я получу исключение.

Excp [WinError 6] The handle is invalid when trying to popen a new subprocess check_output

Я также tr ied

output =. subprocess.check_call("C:\Program Files\MyServiceFolder\slave_upgrade.bat")

, для которого я получаю ошибку

Command '"C:\Program Files\MyServiceFolder\slave_upgrade.bat"' returned non-zero exit status 1.

Чего мне не хватает. Я предполагаю, что это связано с windows ограничениями безопасности службы, чем с тем, как я вызываю файл bat.

Любая помощь приветствуется.

...