Запуск службы Windows в интерактивном сеансе
У коллеги есть программа пакетного сценария, которую необходимо запустить на Windows Server в режиме консоли, чтобы иметь доступ к интерактивному сеансу Windows. Сервер автоматически перезагружается через равные промежутки времени (на этом компьютере запущено несвязанное приложение с закрытым исходным кодом, которое мы не можем контролировать). После перезагрузки он хочет автоматически запустить интерактивный сеанс Windows и запустить этот сценарий, а также службе также необходим доступ к сетевым ресурсам (в частности, к дискам CIFS).
Вот что мы уже пробовали:
- Запустите как службу Windows. Это не удалось, поскольку служба Windows может иметь доступ либо к интерактивному сеансу, либо к сетевым ресурсам, но не к обоим.
- Использовал консоль управления Microsoft, чтобы добавить скрипт для запуска при запуске, однако это не сработало.
- Использовал раздел реестра HKLM, чтобы запустить этот скрипт, однако он запускается только тогда, когда мы вручную открываем сеанс удаленного рабочего стола на сервере.
- Создание запланированного задания. Запущенная программа не имела доступа к сеансу интерактивных окон.
Любые другие предложения? (Или, может быть, он что-то упустил, когда создал одно из этих предложений?)
5 ответов
В случае, если "Взаимодействовать с рабочим столом" на сервисе недостаточно (я видел несколько случаев, когда его нет), вы можете объединить его с AutoAdminLogon. Создайте три (или четыре для домена) значения REG_SZ в разделе HKLM \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon:
- DefaultUserName
- DefaultPassword
- DefaultDomain
- AutoAdminLogon
AutoAdminLogon должен быть установлен на строку "1", остальные говорят сами за себя.
Очевидно, это имеет проблемы с безопасностью, достаточно большие, чтобы пролететь над Юпитером.
Вы пытались запустить скрипт как службу Windows, но позволяли ему взаимодействовать с рабочим столом?
В частности:
- Перейти на страницу свойств сервиса
- Нажмите на вкладку "Вход"
- Выберите "Локальная системная учетная запись"
- Установите флажок "Разрешить сервису взаимодействовать с рабочим столом"
См. Мой аналогичный вопрос и реальный ответ на него: Как запустить процесс из службы Windows в текущий пользователь, вошедший в сеанс пользователя. ПРИМЕЧАНИЕ. Флажка "Взаимодействовать с рабочим столом" не достаточно.
Я рекомендую пойти по этому поводу по-другому. Вы могли бы создать другое приложение для Windows, которое связывается через IPC со службой Windows, и это может быть то, что имеет дело с закрытым приложением souorce. Но если вам необходимо, вы можете указать опцию в сервисе (вы можете сделать это через MMC, реестр и т. Д.). По сути, вы можете увидеть эту опцию, перейдя в "Управление компьютером" -> "Службы и приложения" -> "Службы" -> щелкните правой кнопкой мыши службу -> "Изменить учетную запись на локальную систему" и установите флажок "Разрешить системе взаимодействовать с рабочим столом".
Однако, опять же, я рекомендую выбрать другой путь.
Я должен был сделать что-то подобное в последнее время; маршрут, который я обнаружил, но отказался из-за проблем с безопасностью, состоит в том, чтобы интерактивный сервис установил себя как работающий в интерактивном режиме, а затем запустил функцию ImpersonateUser в API win32, который, я думаю, обеспечит преимущества как для пользователя, так и для интерактивного сеанса. доступны из LocalSystem.
Излишне говорить, что если кто-то взломает службу, которая это сделает, он получит полный контроль над машиной.