Подскажите IPC
От: Denys V. Украина http://ua.linkedin.com/in/dvalchuk
Дата: 05.02.13 13:03
Оценка:
Подскажите плиз IPC работающий между приложениями на одной машине но запущенных под разными пользователями.
Оба процесса не оконные. Один запущен под Local Service второй под пользовательским аккаунтом.
boost::message_queue и SendThreadMessage к сожалению работают только под одним пользователем.
Буду очень признателен за ответ.
Сообщения короткие, не частые.
avalon 1.0rc3 build 432, zlib 1.2.5
С уважением Denys Valchuk

IMHO чем больше мнений тем оптимальней выбор варианта... :)
Re: Подскажите IPC
От: okman Беларусь https://searchinform.ru/
Дата: 05.02.13 17:52
Оценка: 10 (2)
Здравствуйте, Denys V., Вы писали:

DV>Подскажите плиз IPC работающий между приложениями на одной машине но запущенных под разными пользователями.

DV>Оба процесса не оконные. Один запущен под Local Service второй под пользовательским аккаунтом.
DV>boost::message_queue и SendThreadMessage к сожалению работают только под одним пользователем.
DV>Буду очень признателен за ответ.
DV>Сообщения короткие, не частые.

Наиболее простые и эффективные механизмы IPC в Windows — это каналы (Pipes) и отображаемые в
память файлы (Memory Mapped Files, MMF). Оба реализованы через разделяемую память и при
правильном использовании дают максимальную скорость обмена данными.

При использовании канала все, что требуется — создать его, настроить безопасность и
прокинуть один из его концов нужному процессу, после чего можно будет читать и писать данные
функциями ReadFile и WriteFile. Возможен и вариант с открытием по имени (Named Pipes).

При использовании MMF все еще "веселее" — будет выдана область памяти, отображаемая в
адресные пространства нескольких процессов, все вносимые одним процессом изменения будут
сразу же видны другим, и т.д. Синхронизировать доступ придется при помощи других глобальных
объектов, таких как мьютексы, события или семафоры. Единственный, но серъезный минус в
том, что начиная с Windows Vista, создавать MMF в глобальном пространстве имен (а иначе
он не будет разделяться между сессиями) могут лишь системные службы и члены группы
"Администраторы", и это накладывает определенные архитектурные ограничения.

Для обмена между приложениями в стиле ООП можно соорудить глобальный COM-синглтон.
При условии, что нет жестких требований к производительности и есть определенные знания в
данной области. Реализация будет немного тяжеловатой, но получаемые удобства часто
перевешивают этот фактор. Зато получаем "из коробки" синхронизацию, безопасность,
сериализацию данных (при условии, что они все COM-совместимые) и т.д.

Еще люди советуют использовать "голый" RPC. Сам не пробовал, поэтому ничего толком сказать не могу.
Документации по этой теме мало, последняя актуальная литература выходила в начале двухтысячных.
Re[2]: Подскажите IPC
От: Carc Россия https://vk.com/gosha_mazov
Дата: 06.02.13 06:32
Оценка:
Здравствуйте, okman, Вы писали:


O>Единственный, но серъезный минус в

O>том, что начиная с Windows Vista, создавать MMF в глобальном пространстве имен (а иначе
O>он не будет разделяться между сессиями) могут лишь системные службы и члены группы
O>"Администраторы", и это накладывает определенные архитектурные ограничения.
А под глобальным пространством имен подразумевается "Global\\Мое_имя_MMF_файла"? Соответственно для "Local\\*" этих ограничений нет!?! Я правильно понял?
Aml Pages Home
Re[3]: Подскажите IPC
От: okman Беларусь https://searchinform.ru/
Дата: 06.02.13 08:40
Оценка:
Здравствуйте, Carc, Вы писали:

C>А под глобальным пространством имен подразумевается "Global\\Мое_имя_MMF_файла"? Соответственно для "Local\\*" этих ограничений нет!?! Я правильно понял?


Да, правильно. Для создания MMF в глобальном пространстве имен (Global\MyMMF) необходима
привилегия SeCreateGlobalPrivilege ("Создание глобальных объектов"). До Windows Vista эта
привилегия была у служб, администраторов и интерактивных пользователей. Начиная с Vista,
группу "Интерактивные" из этого списка изъяли.
Re[3]: Подскажите IPC
От: okman Беларусь https://searchinform.ru/
Дата: 06.02.13 10:47
Оценка:
P.S.

>> okman:

>> Начиная с Vista, группу "Интерактивные" из этого списка изъяли.

Не с Vista, а вроде даже с Windows XP 64 Bit Edition и Windows Server 2003.
Re: Подскажите IPC
От: Mr.Delphist  
Дата: 06.02.13 14:51
Оценка: 2 (1)
Здравствуйте, Denys V., Вы писали:

DV>Подскажите плиз IPC работающий между приложениями на одной машине но запущенных под разными пользователями.

DV>Оба процесса не оконные. Один запущен под Local Service второй под пользовательским аккаунтом.
DV>boost::message_queue и SendThreadMessage к сожалению работают только под одним пользователем.
DV>Буду очень признателен за ответ.
DV>Сообщения короткие, не частые.

Сокеты. Только надо помнить, что
1) Services that run as the Local Service account access network resources as a null session without credentials.
2) Трафик между локальными портами будет передаваться напрямую, без спуска на уровень драйверов, поэтому WireShark ничего не нанюхает (разве что у Вас две сетевухи, и посыл идёт с IP+порта одной на IP+порт другой).
Re[2]: Подскажите IPC
От: okman Беларусь https://searchinform.ru/
Дата: 06.02.13 15:44
Оценка: 6 (1)
Здравствуйте, Mr.Delphist, Вы писали:

MD>2) Трафик между локальными портами будет передаваться напрямую, без спуска на уровень драйверов, ...


Это не совсем так.
Часть стека TCP/IP находится в ядре (конкретно — tcpip.sys/tdx.sys) и данные,
отправленные на localhost, проходят через эти драйвера. Хотя до уровня драйверов
сетевой карты (NDIS) они не дойдут. Поэтому переключений в ядро при использовании
сокетов избежать не удастся.
Re[3]: Подскажите IPC
От: Mr.Delphist  
Дата: 06.02.13 21:43
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Mr.Delphist, Вы писали:


MD>>2) Трафик между локальными портами будет передаваться напрямую, без спуска на уровень драйверов, ...


O>Это не совсем так.

O>Часть стека TCP/IP находится в ядре (конкретно — tcpip.sys/tdx.sys) и данные,
O>отправленные на localhost, проходят через эти драйвера. Хотя до уровня драйверов
O>сетевой карты (NDIS) они не дойдут. Поэтому переключений в ядро при использовании
O>сокетов избежать не удастся.

Угу, спасибо за уточнение — а то я так по-рабоче-крестьянски изложил, в самом деле может кого спутать.
Re[2]: Подскажите IPC
От: Denys V. Украина http://ua.linkedin.com/in/dvalchuk
Дата: 07.02.13 08:59
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD> Сокеты. Только надо помнить, что

MD> 1) Services that run as the Local Service account access network resources as a null session without credentials.
MD> 2) Трафик между локальными портами будет передаваться напрямую, без спуска на уровень драйверов, поэтому WireShark ничего не нанюхает (разве что у Вас две сетевухи, и посыл идёт с IP+порта одной на IP+порт другой).

Интерессно. В плане, что это проще всего.
А как насчет файервола? для localhost не прийдется создавать правило?
avalon 1.0rc3 build 432, zlib 1.2.5
С уважением Denys Valchuk

IMHO чем больше мнений тем оптимальней выбор варианта... :)
Re[3]: Подскажите IPC
От: Mr.Delphist  
Дата: 08.02.13 08:33
Оценка:
Здравствуйте, Denys V., Вы писали:

DV>Здравствуйте, Mr.Delphist, Вы писали:


MD>> Сокеты. Только надо помнить, что

MD>> 1) Services that run as the Local Service account access network resources as a null session without credentials.
MD>> 2) Трафик между локальными портами будет передаваться напрямую, без спуска на уровень драйверов, поэтому WireShark ничего не нанюхает (разве что у Вас две сетевухи, и посыл идёт с IP+порта одной на IP+порт другой).

DV>Интерессно. В плане, что это проще всего.

DV>А как насчет файервола? для localhost не прийдется создавать правило?

Насколько помню, виндовый файервол стреляет в момент bind() — так что зависит от адреса. Надо пробовать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.