Я написал клиентское (консольное) приложение C ++ для DDE, которое общается со сторонним сервером dde. Это прекрасно работает, когда мой клиент и сервер находятся в одном сеансе.
Затем я переместил свой клиентский код в службу win32, работающую как SYSTEM. Клиентский код не может получить список серверов, несмотря на следующие попытки:
1. Я попытался включить «Разрешить службе взаимодействовать с рабочим столом» на Win7.
2. Я выдал себя за пользователя в потоке, который пытается общаться с сервером.
3 Я попытался выполнить клиентский код как системный.
Я могу понять, что основная проблема заключается в связи между несколькими сессиями. Но есть ли способ достичь элегантного?
Начиная с Vista, «интерактивные» сервисы больше не работают из-за Сессия 0 Изоляция.
DDE — это технология, основанная на User32 (она использует оконные сообщения для внутреннего использования), и поэтому ее нельзя использовать за пределами сеанса.
Чтобы сделать то, что вы пытаетесь, вам нужно будет создать отдельное не сервисное приложение, которое запускается в контексте пользовательского сеанса и использует DDE по мере необходимости, взаимодействуя с сервисом через механизм IPC, не зависящий от сеанса, такой как именованный канал, сокет или COM-объект. Сервис может использовать WTSQueryUserToken()
а также CreateProcessAsUser()
запускать приложение в рамках определенного сеанса пользователя, когда это необходимо. Или вы можете настроить приложение на автоматический запуск при входе пользователя в систему.