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

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

вот что мы пробовали до сих пор:

  1. запуск как служба Windows. Это не удалось, так как служба Windows может или иметь доступ к интерактивной сессии или к сетевым ресурсам, но не оба.
  2. используется консоль управления Microsoft, чтобы добавить скрипт для запуска при запуске, однако это не сработало.
  3. используется раздел реестра HKLM для запуска этого сценария, однако он получает только запускается, когда мы вручную открываем сеанс удаленного рабочего стола на сервере.
  4. создание запланированной задачи. Вызванная программа не имела доступа к интерактивному сеансу windows.

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

5 ответов


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

  • разделы defaultusername
  • DefaultPassword
  • Домен_по_умолчанию
  • AutoAdminLogon

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

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


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

в частности:

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

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

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


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

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


см. мой аналогичный вопрос и реальный ответ на него:Как запустить процесс из службы windows в текущий сеанс пользователя Примечание: флажок "взаимодействовать с рабочим столом" не достаточно вообще.