Запуск службы Windows в интерактивном сеансе

У коллеги есть программа пакетного сценария, которую необходимо запустить на Windows Server в режиме консоли, чтобы иметь доступ к интерактивному сеансу Windows. Сервер автоматически перезагружается через равные промежутки времени (на этом компьютере запущено несвязанное приложение с закрытым исходным кодом, которое мы не можем контролировать). После перезагрузки он хочет автоматически запустить интерактивный сеанс Windows и запустить этот сценарий, а также службе также необходим доступ к сетевым ресурсам (в частности, к дискам CIFS).

Вот что мы уже пробовали:

  1. Запустите как службу Windows. Это не удалось, поскольку служба Windows может иметь доступ либо к интерактивному сеансу, либо к сетевым ресурсам, но не к обоим.
  2. Использовал консоль управления Microsoft, чтобы добавить скрипт для запуска при запуске, однако это не сработало.
  3. Использовал раздел реестра HKLM, чтобы запустить этот скрипт, однако он запускается только тогда, когда мы вручную открываем сеанс удаленного рабочего стола на сервере.
  4. Создание запланированного задания. Запущенная программа не имела доступа к сеансу интерактивных окон.

Любые другие предложения? (Или, может быть, он что-то упустил, когда создал одно из этих предложений?)

5 ответов

Решение

В случае, если "Взаимодействовать с рабочим столом" на сервисе недостаточно (я видел несколько случаев, когда его нет), вы можете объединить его с AutoAdminLogon. Создайте три (или четыре для домена) значения REG_SZ в разделе HKLM \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon:

  • DefaultUserName
  • DefaultPassword
  • DefaultDomain
  • AutoAdminLogon

AutoAdminLogon должен быть установлен на строку "1", остальные говорят сами за себя.

Очевидно, это имеет проблемы с безопасностью, достаточно большие, чтобы пролететь над Юпитером.

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

В частности:

  1. Перейти на страницу свойств сервиса
  2. Нажмите на вкладку "Вход"
  3. Выберите "Локальная системная учетная запись"
  4. Установите флажок "Разрешить сервису взаимодействовать с рабочим столом"

См. Мой аналогичный вопрос и реальный ответ на него: Как запустить процесс из службы Windows в текущий пользователь, вошедший в сеанс пользователя. ПРИМЕЧАНИЕ. Флажка "Взаимодействовать с рабочим столом" не достаточно.

Я рекомендую пойти по этому поводу по-другому. Вы могли бы создать другое приложение для Windows, которое связывается через IPC со службой Windows, и это может быть то, что имеет дело с закрытым приложением souorce. Но если вам необходимо, вы можете указать опцию в сервисе (вы можете сделать это через MMC, реестр и т. Д.). По сути, вы можете увидеть эту опцию, перейдя в "Управление компьютером" -> "Службы и приложения" -> "Службы" -> щелкните правой кнопкой мыши службу -> "Изменить учетную запись на локальную систему" ​​и установите флажок "Разрешить системе взаимодействовать с рабочим столом".

Однако, опять же, я рекомендую выбрать другой путь.

Я должен был сделать что-то подобное в последнее время; маршрут, который я обнаружил, но отказался из-за проблем с безопасностью, состоит в том, чтобы интерактивный сервис установил себя как работающий в интерактивном режиме, а затем запустил функцию ImpersonateUser в API win32, который, я думаю, обеспечит преимущества как для пользователя, так и для интерактивного сеанса. доступны из LocalSystem.

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

Другие вопросы по тегам