Как дать доступ к разделенной памяти для пользовательских программ из сервиса
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Как дать доступ к разделенной памяти для... Expand / Collapse
Автор
Сообщение
07.07.2006 13:24


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 26.10.2008 16:56
Сообщ.: 279, Visits: 3 003
У меня такая проблема, при запуске компьютера стартует сервис с правами SYSTEM. Этот сервис создает разделенную память и помещает в нее идентификатор потока, который может получать сообщения от пользователей. Сообщения передаются с помощью PostThreadMessage.

Проблема в том, что когда клиент пытается открыть доступ к памяти с помощью OpenFileMapping, то он получает хендл равный 0.

Как я понимаю, при создании этой памяти ей устанавливаются права доступа только для SYSTEM. Каким образом я могу создать эту память и установить доступ к ней на чтение, но для всех?

Кстати, опишу задачу шире, может у кого будут другие идеи.

Программа стартует на сервере в качестве сервиса, выполняет свои задачи, но не имеет пользовательского интерфейса. Когда оператору надо проверить данные о выполнении или изменить настройки он должен запустить некую программу (в моем случае тот же выполняемый файл, но с другими параметрами) и получить пользовательский интерфейс. Я решил, что легче всего будет при запуске сервиса создать разделяемую память и в нее поместить ID того потока, который отвечает за открытие пользовательского интерфейса. Тогда при запуске программы в пользовательском режиме программа откроет эту память, получит поток и пошлет ему сообщение, после чего спокойно закроется, а сервис продолжит работу, но уже в графическом режиме.

Была так же идея с внедрением клиенсткого процесса в процесс сервиса с получением адресса необходимой процедуры, но там будет много проблем с синхронизацией и, так же, с атрибутами безопасности.

Буду рад любой помощи, а так же интересным и простым идеям.

Спасибо.

Сообщ. #900292
08.07.2006 1:40
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298, Visits: 12 501
Хе-хе, сейчас модно через сокеты ;)

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

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

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

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

Вторым атрибутом этой ф-ции идет LPSECURITY_ATTRIBUTES lpAttributes, если у задать NULL, то:
If lpAttributes is NULL, the file mapping object gets a default security descriptor.

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

Удачи,
Владимир
Сообщ. #900327
08.07.2006 14:45


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 26.10.2008 16:56
Сообщ.: 279, Visits: 3 003
Собственно вопрос был именно по этой структуре, я раньше не сталкивался с атрибутами безопасности, поэтому не понимаю, как с ней работать. Я пытаюсь разобраться через MSDN, но пока для меня это слишком запутанно. Если-бы у меня было пару примеров с разрешением/запрещением доступа к ресурсу + MSDN, то было бы на много легче с этим разобраться.
Сообщ. #900334
08.07.2006 15:10
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298, Visits: 12 501
Вот тут есть пример подробными комментариями:
http://msdn.microsoft.com/library/en-us/secbp/security/creating_a_dacl.asp

Удачи,
Владимир
Сообщ. #900335
13.07.2006 17:57


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 26.10.2008 16:56
Сообщ.: 279, Visits: 3 003
Спасибо, пример как раз в точку. Сейчас заработало.

А по поводу сокетов, идея интересная, надо подумать на будующее.

Сообщ. #900675
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 6:22