Помогите, пожалуйста, победить следующую проблему:
Сервис работает под LocalSystem и в процессе работы создаёт отображаемый в памяти файл.
Как заставить систему разрешить приложению под ограниченным аккаунтом читать этот файл?
Впрочем, сервис тоже не может прочесть созданную приложением память.
Win 7, UAC отключен, там где требуется SecurityAttributes пока nil. Пробовал передавать, но тогда были проблемы и в админском аккаунте.
Имя отображения с префиксом "Global\".
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
10-07-2019 00:28 | Сообщение от автора вопроса
Спасибо, Александр. Я уже пытался изучить эту возможность. Манипулировал с DACL и SACL, но ничего не получилось. Почитал обсуждения в инете и понял, что программно выдать такие привилегии простому пользователю нельзя. Кроме того, если верить информации на этих сайтах, ситуация с разными глобальными мутексами и тп. отличается от MMF. Конечно, есть выход в создании памяти на стороне сервиса, с последующей записью в неё из приложения. Пока вставил постыдную затычку с файлом на диске.
Даже стыдно, но когда посмотрел в модуль с реализацией IPC, то понял, что он не маилслотах, а не на пайпах. А там вроде ограничение в 424 байта? Вернулся к MMF. Под админом всё проходит без нареканий. Под бесправным пользователем могу открыть отображение и считать данные, но попытка CreateFileMapping возвращает ноль и ошибку 87 - Неверно задан параметр. Может ли ограниченный пользователь создавать объекты с Global\? Мне кажется, с этим связано. :(
Inferno Решил переписать на pipes, потому что там работает, но буфер маленький.
Маленький - это какой?
При создании пайпа мы указываем размеры буферов ввода/вывода, но для системы они носят рекомендательный характер. При необходимости система будет их изменять. Буфера для пайпов размещаются в nonpaged pool, поэтому принципиальное ограничение - это размер физической памяти.
В этом принципиальное отличие от MMF, которые располагаются в выгружаемой области памяти.
Модель пайпов хорошо подходит для передачи потоков данных и сообщений. Модель разделяемой памяти лучше для передачи статических образов.
Спасибо за информацию. Ситуация такая: приложение под админом и сервис под LocalSystem (UAC пока отключен везде) прекрасно видят разделяемую память. Но стоит войти под пользователем с ограниченными правами - начинаются проблемы. Понаписал вчера кучу кода со всеми этими сидами, пидами и секурити. Запутался. Наверное наделал ошибок. У пользователей запуск от админа исключен и будет включен UAC.
Решил переписать на pipes, потому что там работает, но буфер маленький. Просто надо добавить в IPC классы методы для блочной передачи/приема.
Я где-то читал, что MMF лежит не только в основе буфера обмена, но даже pipes. Т.е. это самое низкоуровневое решение. Но не хватает квалификации, или это, действительно, невозможно.
В одной своей программе я делал обмен через разделяемую память между экземплярами. Имя с префиксом Global. Security Descriptor инициализирован, но без Security Attributes.
Первым вызывается CreateMutex, результат проверяется Win32Check, и затем по GetLastError <> ERROR_ALREADY_EXISTS выясняется, что это был первый экземпляр.
Потом вызывается CreateFileMapping и т.д.
Так вот что происходит.
Windows 10 (в 7 так же), UAC включён.
1. Запуск в обычном режиме, админ (это не важно), но без поднятия прав (это важно). Получаем ошибку №5 - Access denied. Это результат работы Win32Check.
2.1. Запуск Run as Administrator. Успешно создаются все глобальные объекты.
2.2. Повторный запуск той же программы в обычном режиме. Успешно открываются глобальные объекты, созданные в первом экземпляре.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.