Ответ 1
Приложение GUI требует рабочего стола, и вы получаете только один из них для зарегистрированного пользователя.
Я запускаю небольшой исполняемый файл, созданный третьей стороной, которая должна регулярно запускаться на сервере Windows 2008. Этот исполняемый файл эффективно использует информацию ETL от одной системы к другой и должен работать каждый час или около того круглосуточно. В рамках своей обработки исполняемый файл запускает небольшой пользовательский интерфейс Windows Forms.
Я установил запланированную задачу для вызова файла, и это работает ТОЛЬКО, если пользователь, под которым настроен запуск задачи, регистрируется на компьютере (локально или через удаленный рабочий стол). Если я задал задачу для запуска в качестве другого пользователя или задал задачу для запуска, когда пользователь не был зарегистрирован, выполнение запланированной задачи и ошибки. Я пробовал работать как разные пользователи, включая пользователя-администратора и пользователя системы. Возможны ли возможные способы обхода (без изменения кода третьей стороны, к которому у меня нет доступа), который позволил бы запускать этот код без участия конкретного пользователя.
Приложение GUI требует рабочего стола, и вы получаете только один из них для зарегистрированного пользователя.
В этой статье показано, как создать задачу, не требующую входа: 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
Возможно, я опоздал на ответ, но мы не можем использовать команду без/интерактивных...
https://support.microsoft.com/en-us/kb/313565
В соответствии с microsoft:/interactive: используйте этот параметр, чтобы позволить задаче взаимодействовать с рабочим столом пользователя, который вошел в систему во время выполнения задачи.
Я думаю, что нашел решение для этой ситуации. Вам нужно иметь две учетные записи на сервере (User1 и User2). RMD на сервер под User1. В рамках этого RMD создайте запланированную задачу и установите ее для запуска под учетной записью User2. Затем, изнутри этого RMD, вам нужно RMD в самом сервере, используя учетные данные User2 (вроде как сон-мечты во сне). Важно не минимизировать это новое окно RMD; вы можете сделать его маленьким, но он должен быть открытым. Затем вы можете закрыть исходный сеанс RMD, и задача будет запущена под учетной записью User2, поскольку User2 имеет открытый рабочий стол со второго сеанса RMD.
Protip - не отключайте ручки окна RMD в верхней части окна RMD - тогда может быть больно закрыть правильный RMD. Если вы это сделаете, вам нужно будет использовать опцию "Пуск" > "Выход" полностью из ваших RMD.
Существует простое решение. Измените группу на "пользователей" локальной группы, и вам не будет предложено ввести пароль. (Запланированная задача - Общие - Параметры безопасности - Изменение пользователя или группы).
Казалось бы, из проведенного мной исследования (и ответа Дэвида Хеффернана), не затрагивая исходный код, это невозможно.
Есть несколько полезных мыслей о Как я могу запустить приложение Windows GUI как службу?, которые относятся к этому, но ни один из них не дает жизнеспособного решения этой проблемы.
Это выглядит как старый поток, но я недавно столкнулся с этим в своей организации из-за требований 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"
Мои первоначальные тесты показывают, что это работает, однако я не вижу заметной разницы с задачей в планировщике задач, когда делаю это. Итак, я не уверен, как проверить, установлен ли он для этого.