Форум программистов, компьютерный форум CyberForum.ru

Как дать доступ к разделенной памяти для пользовательских программ из сервиса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
kpoxa
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
07.07.2006, 17:24     Как дать доступ к разделенной памяти для пользовательских программ из сервиса #1
У меня такая проблема, при запуске компьютера стартует сервис с правами SYSTEM. Этот сервис создает разделенную память и помещает в нее идентификатор потока, который может получать сообщения от пользователей. Сообщения передаются с помощью PostThreadMessage.
Проблема в том, что когда клиент пытается открыть доступ к памяти с помощью OpenFileMapping, то он получает хендл равный 0.
Как я понимаю, при создании этой памяти ей устанавливаются права доступа только для SYSTEM. Каким образом я могу создать эту память и установить доступ к ней на чтение, но для всех?
Кстати, опишу задачу шире, может у кого будут другие идеи.
Программа стартует на сервере в качестве сервиса, выполняет свои задачи, но не имеет пользовательского интерфейса. Когда оператору надо проверить данные о выполнении или изменить настройки он должен запустить некую программу (в моем случае тот же выполняемый файл, но с другими параметрами) и получить пользовательский интерфейс. Я решил, что легче всего будет при запуске сервиса создать разделяемую память и в нее поместить ID того потока, который отвечает за открытие пользовательского интерфейса. Тогда при запуске программы в пользовательском режиме программа откроет эту память, получит поток и пошлет ему сообщение, после чего спокойно закроется, а сервис продолжит работу, но уже в графическом режиме.
Была так же идея с внедрением клиенсткого процесса в процесс сервиса с получением адресса необходимой процедуры, но там будет много проблем с синхронизацией и, так же, с атрибутами безопасности.
Буду рад любой помощи, а так же интересным и простым идеям.
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2006, 17:24     Как дать доступ к разделенной памяти для пользовательских программ из сервиса
Посмотрите здесь:

C++ Перегрузка опереторов для пользовательских класов
Доступ к памяти другого процесса C++
C++ Разработка и отладка алгоритмов и программ с применением пользовательских функций
Получить доступ к памяти C++
C++ Обработка исключений в классах для пользовательских типов
Доступ к памяти по адресу C++
C++ Использование потокового итератора для пользовательских обьектов
C++ Разработка и отладка алгоритмов и программ с применением пользовательских функций
Доступ к произвольному адресу памяти C++
Шаблон для пользовательских типов данных C++
Возможно ли переопределение операторов для пользовательских типов? C++
Доступ к vector<pair<.>> как к памяти C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
08.07.2006, 05:40     Как дать доступ к разделенной памяти для пользовательских программ из сервиса #2
Хе-хе, сейчас модно через сокеты



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



После этого, если правильно разработать управляющий сервисом или его некоторыми параметрами протокол, можно будет написать клиента локального или удаленного на любом языке и с любым интерфейсом



Ну это так, теоретически..



Вернемся к сути вопроса. Для того чтобы разделить память между процессами, если я правильно все понимаю, используется API функция CreateFileMapping (http://msdn.microsoft.com/library/en...ilemapping.asp)



Вторым атрибутом этой ф-ции идет LPSECURITY_ATTRIBUTES lpAttributes, если у задать NULL, то:

If lpAttributes is NULL, the file mapping object gets a default security descriptor.



Что нужно сделать? Создать и правильно заполнить структуру SECURITY_ATTRIBUTES так чтобы дать права всем локальным пользователям или администраторам на доступ к разделенной памяти после этого разделенная память должна быть доступна процессам, запущеным под пользователем а не из под SYSTEM



Удачи,

Владимир
kpoxa
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
08.07.2006, 18:45  [ТС]     Как дать доступ к разделенной памяти для пользовательских программ из сервиса #3
Собственно вопрос был именно по этой структуре, я раньше не сталкивался с атрибутами безопасности, поэтому не понимаю, как с ней работать. Я пытаюсь разобраться через MSDN, но пока для меня это слишком запутанно. Если-бы у меня было пару примеров с разрешением/запрещением доступа к ресурсу + MSDN, то было бы на много легче с этим разобраться.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
08.07.2006, 19:10     Как дать доступ к разделенной памяти для пользовательских программ из сервиса #4
Вот тут есть пример подробными комментариями:

http://msdn.microsoft.com/library/en...ing_a_dacl.asp



Удачи,

Владимир
kpoxa
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
13.07.2006, 21:57  [ТС]     Как дать доступ к разделенной памяти для пользовательских программ из сервиса #5
Спасибо, пример как раз в точку. Сейчас заработало.
А по поводу сокетов, идея интересная, надо подумать на будующее.
Yandex
Объявления
13.07.2006, 21:57     Как дать доступ к разделенной памяти для пользовательских программ из сервиса
Ответ Создать тему
Опции темы

Текущее время: 02:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru