Обходной путь для того, что запланированная задача в Windows требует, чтобы пользователь вошел в систему

Я запускаю небольшой исполняемый файл, созданный третьей стороной, которая должна регулярно запускаться на сервере Windows 2008. Этот исполняемый файл эффективно использует информацию ETL от одной системы к другой и должен работать каждый час или около того круглосуточно. В рамках своей обработки исполняемый файл запускает небольшой пользовательский интерфейс Windows Forms.

Я установил запланированную задачу для вызова файла, и это работает ТОЛЬКО, если пользователь, под которым настроен запуск задачи, регистрируется на компьютере (локально или через удаленный рабочий стол). Если я задал задачу для запуска в качестве другого пользователя или задал задачу для запуска, когда пользователь не был зарегистрирован, выполнение запланированной задачи и ошибки. Я пробовал работать как разные пользователи, включая пользователя-администратора и пользователя системы. Возможны ли возможные способы обхода (без изменения кода третьей стороны, к которому у меня нет доступа), который позволил бы запускать этот код без участия конкретного пользователя.

Ответ 1

Приложение GUI требует рабочего стола, и вы получаете только один из них для зарегистрированного пользователя.

Ответ 2

В этой статье показано, как создать задачу, не требующую входа: https://www.scriptjunkie.us/2013/01/running-code-from-a-non-elevated-account-at-any-time/

Описанная процедура выглядит следующим образом:

Во-первых, создайте запланированную задачу для запуска вашей команды с параметрами по умолчанию в качестве текущего пользователя (это будет по умолчанию создавать запланированную задачу, которая запускается только при входе в систему):

schtasks /create /tn mytask /SC HOURLY /TR "calc"

Затем экспортируйте задачу как XML:

schtasks /query /XML /tn mytask > temp.xml

и удалите задание:

schtasks /delete /tn mytask /f

Затем откройте файл xml и замените строку <LogonType>InteractiveToken</LogonType>с <LogonType>S4U</LogonType>

Это можно сделать с помощью следующих команд, предполагающих, что powershell находится в системе: powershell -Command "Get-Content '.\temp.xml' | foreach {$_ -replace 'InteractiveToken', 'S4U' }" > new.xml move /y new.xml temp.xml

Теперь заново создайте задачу из измененного XML файла:

schtasks /create /xml temp.xml /tn mytasks

и удалите временный файл:

del /f /q temp.xml

Ответ 3

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

https://support.microsoft.com/en-us/kb/313565

В соответствии с microsoft:/interactive: используйте этот параметр, чтобы позволить задаче взаимодействовать с рабочим столом пользователя, который вошел в систему во время выполнения задачи.

Ответ 4

Я думаю, что нашел решение для этой ситуации. Вам нужно иметь две учетные записи на сервере (User1 и User2). RMD на сервер под User1. В рамках этого RMD создайте запланированную задачу и установите ее для запуска под учетной записью User2. Затем, изнутри этого RMD, вам нужно RMD в самом сервере, используя учетные данные User2 (вроде как сон-мечты во сне). Важно не минимизировать это новое окно RMD; вы можете сделать его маленьким, но он должен быть открытым. Затем вы можете закрыть исходный сеанс RMD, и задача будет запущена под учетной записью User2, поскольку User2 имеет открытый рабочий стол со второго сеанса RMD.

Protip - не отключайте ручки окна RMD в верхней части окна RMD - тогда может быть больно закрыть правильный RMD. Если вы это сделаете, вам нужно будет использовать опцию "Пуск" > "Выход" полностью из ваших RMD.

Ответ 5

Существует простое решение. Измените группу на "пользователей" локальной группы, и вам не будет предложено ввести пароль. (Запланированная задача - Общие - Параметры безопасности - Изменение пользователя или группы).

Ответ 6

Казалось бы, из проведенного мной исследования (и ответа Дэвида Хеффернана), не затрагивая исходный код, это невозможно.

Есть несколько полезных мыслей о Как я могу запустить приложение Windows GUI как службу?, которые относятся к этому, но ни один из них не дает жизнеспособного решения этой проблемы.

Ответ 7

Это выглядит как старый поток, но я недавно столкнулся с этим в своей организации из-за требований UAC, которые они не использовали. Я все еще тестирую это, но я полагаю, что вы все еще можете включить интерактивный режим для запланированной задачи, используя команду /Change в задаче и добавив флаг /IT, чтобы сделать его интерактивным. Ссылка здесь: https://docs.microsoft.com/en-us/windows/desktop/taskschd/schtasks

schtasks /Change /tn "Task A" /IT /RP "password of user if used"

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