|
|
|
Supreme Being
      
участник
Last Login: 26.10.2008 16:56
Сообщ.: 279,
Visits: 3 003
|
|
| У меня такая проблема, при запуске компьютера стартует сервис с правами SYSTEM. Этот сервис создает разделенную память и помещает в нее идентификатор потока, который может получать сообщения от пользователей. Сообщения передаются с помощью PostThreadMessage. Проблема в том, что когда клиент пытается открыть доступ к памяти с помощью OpenFileMapping, то он получает хендл равный 0. Как я понимаю, при создании этой памяти ей устанавливаются права доступа только для SYSTEM. Каким образом я могу создать эту память и установить доступ к ней на чтение, но для всех? Кстати, опишу задачу шире, может у кого будут другие идеи. Программа стартует на сервере в качестве сервиса, выполняет свои задачи, но не имеет пользовательского интерфейса. Когда оператору надо проверить данные о выполнении или изменить настройки он должен запустить некую программу (в моем случае тот же выполняемый файл, но с другими параметрами) и получить пользовательский интерфейс. Я решил, что легче всего будет при запуске сервиса создать разделяемую память и в нее поместить ID того потока, который отвечает за открытие пользовательского интерфейса. Тогда при запуске программы в пользовательском режиме программа откроет эту память, получит поток и пошлет ему сообщение, после чего спокойно закроется, а сервис продолжит работу, но уже в графическом режиме. Была так же идея с внедрением клиенсткого процесса в процесс сервиса с получением адресса необходимой процедуры, но там будет много проблем с синхронизацией и, так же, с атрибутами безопасности. Буду рад любой помощи, а так же интересным и простым идеям. Спасибо.
|
|
|
|
|
Supreme 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
Удачи,
Владимир
|
|
|
|
|
Supreme Being
      
участник
Last Login: 26.10.2008 16:56
Сообщ.: 279,
Visits: 3 003
|
|
| Собственно вопрос был именно по этой структуре, я раньше не сталкивался с атрибутами безопасности, поэтому не понимаю, как с ней работать. Я пытаюсь разобраться через MSDN, но пока для меня это слишком запутанно. Если-бы у меня было пару примеров с разрешением/запрещением доступа к ресурсу + MSDN, то было бы на много легче с этим разобраться.
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298,
Visits: 12 501
|
|
|
|
|
|
Supreme Being
      
участник
Last Login: 26.10.2008 16:56
Сообщ.: 279,
Visits: 3 003
|
|
| Спасибо, пример как раз в точку. Сейчас заработало. А по поводу сокетов, идея интересная, надо подумать на будующее.
|
|
|
|