Попытка создать глобальный объект сопоставления файлов из процесса пользовательского режима не удалась.

У меня есть приложение для Windows, которое работает без повышения прав. Мне нужно создать объект сопоставления файлов для массива памяти, который будет совместно использоваться всеми работающими экземплярами приложения (обратите внимание, что некоторые из этих экземпляров могут работать в разных сеансах входа в систему).

Я вызываю CreateFileMapping API для его создания с глобальным именем, т. е. Global\sharedname, с использованием дескриптора безопасности, который дает all доступ к everyone, но этот API дает сбой с кодом ошибки 5 или ERROR_ACCESS_DENIED.

Затем я начал читать документы и обнаружил, что для моего процесса требуется привилегия SeCreateGlobalPrivilege. Но затем, когда я пытаюсь назначить эту привилегию, AdjustTokenPrivileges возвращает код ошибки ERROR_NOT_ALL_ASSIGNED, и я застрял....

Так в чем здесь хитрость, как этот чертов MS хочет, чтобы мы это сделали???

PS. Я могу без проблем создать глобальный именованный мьютекс (для синхронизированного доступа к общей памяти) с тем же дескриптором безопасности all access for everyone и именем Global\sharedmutex.


person c00000fd    schedule 23.02.2013    source источник
comment
Насколько я могу судить, GLOBAL\sharedname предназначен для создания объектов, к которым можно получить доступ из всех сеансов. Вам действительно нужен доступ к этому из нескольких сеансов или только из нескольких процессов?   -  person Mooing Duck    schedule 22.11.2013


Ответы (1)


Только администраторы и службы, работающие в сеансе 0, могут получить привилегию SeCreateGlobalPrivilege, необходимую для создания сопоставлений файлов в пространстве имен Global. Предполагая, что вы не хотите переписывать свой код в службу, вам придется создать отдельный процесс с повышенными правами для создания сопоставления файлов.

person Remy Lebeau    schedule 23.02.2013
comment
Спасибо за Ваше подтверждение. Я склонялся к тому, чтобы так думать. С другой стороны, насколько нелепо накладывать это ограничение? Почему мы не можем обмениваться данными между процессами без повышенных прав... В любом случае, это не вопрос, это просто мое недовольство платформой. И чтобы ответить на ваш вопрос, нет, я не могу создать процесс с повышенными правами. Обходной путь — использовать общий файл файловой системы для обмена данными. Единственным недостатком является то, что это будет довольно небезопасно, так как мне придется изменить его ACL на everyone has read-write access. - person c00000fd; 23.02.2013