Как заставить Standard EXE и WinService EXE общаться друг с другом? - PullRequest
1 голос
/ 24 марта 2012

У нас есть приложение, которое является частью стандартного EXE и частично WinService EXE. Стандартный EXE-файл порождается разделом «Выполнить» реестра и запускается при входе в систему с учетными данными пользователя, который только что вошел в систему. Для WinService EXE установлено значение «Автоматический запуск», поэтому он всегда работает и работает как LocalSystem (по сути, администратор). ).

Нам нужны эти две программы для обмена данными путем записи информации в файлы XML.

Приложение работает нормально, когда вошедший в систему пользователь имеет доступ к установленной папке (C: \ Program Files \ ourApp). Стандартный EXE записывает данные, а WinService EXE считывает их без проблем, все хорошо.

Однако, когда вошедший в систему пользователь не имеет доступа для записи в установленную папку, данные попадают в виртуализацию UAC и перенаправление данных и заканчиваются где-то еще, а WinService не находит и не может прочитать их из установленной папка.

Чтобы обойти это, мы попытались использовать как стандартный EXE-файл, так и WinService EXE для записи и чтения из% ProgramData%. Это будет работать нормально, за исключением того, что обычные пользователи не имеют разрешения на запись в% ProgramData%.

Мы не можем использовать% LocalAppData%, поскольку для вошедшего в систему пользователя это будет C: \ Users \ LoggedInUser \ AppData \ Local, а для winservice это будет C: \ Users \ Administrator \ AppData \ Local.

Есть ли еще места в Vista и Win7 с включенной виртуализацией UAC, которые позволят как стандартному EXE, работающему только с привилегиями пользователя, так и WinService, работающему как LocalSystem, общаться друг с другом. Мы перепробовали реестр, но проблемы еще хуже. Также последнее, но не менее важное. Нам нужно это для работы с XP без каких-либо различий в коде. Значение XP также имеет переменные окружения для% ProgramData%,% LocalAppData% и т. Д., Может ли он работать в обоих случаях.

1 Ответ

3 голосов
/ 24 марта 2012

Две идеи:

  1. Пусть каждое приложение предоставляет конечную точку WCF, используя именованный канал транспорт, и пусть они разговаривают друг с другом через простой интерфейс по вашему выбору.
  2. Используйте Отображенные в память файлы , чтобы общаться как вы были с дисками.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...