Я пытаюсь создать MemoryMappedFile для процесса с высокой степенью целостности, а затем открыть тот же файл с дочерним процессом с низкой целостностью и использовать эту общую память для IPC. Нет реального файла на диске (с использованием MemoryMappedFile.CreateNew).Получение доступа к MemoryMappedFile из процесса с низкой целостностью
Моя проблема заключается в том, что процесс с низкой целостностью не может открыть общую память, выбрасывая это: «System.UnauthorizedAccessException: доступ к пути запрещен». Я не удивлен, что это так, учитывая, что мне нужен доступ на запись из процесса с низкой целостностью, но как вы предоставляете ему доступ?
Вот мой код:
Средний процесс целостности:
MemoryMappedFileSecurity security = new MemoryMappedFileSecurity();
var file = MemoryMappedFile.CreateNew("test", 4096, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.None, security, HandleInheritability.Inheritable);
var view = file.CreateViewAccessor();
view.Write(0, true);
процесс Низкая Целостность:
try
{
MemoryMappedFile file = MemoryMappedFile.OpenExisting("test", MemoryMappedFileRights.ReadWrite);
var view = file.CreateViewAccessor();
var v = view.ReadBoolean(0);
Log.Info("MAPPED: " + v);
}
catch (Exception e)
{
Log.Info("Error: " + e);
}
работает хорошо, если оба процесса работают в среде целостности. После прочтения this, я попытался установить строку SDDL на процесс средней целостности, как это:
security.SetSecurityDescriptorSddlForm("S:(ML;;NW;;;LW)");
Но это дает мне еще одно исключение, на этот раз, когда создается отображенный файл памяти: «System.IO.IOException: A требуемая привилегия не удерживается клиентом ». Не совсем уверен, что это правильный способ сделать это в любом случае, я не совсем понимаю, как примеры Win32/C++ переходят на C# ...
Кто-нибудь знает об этом больше?
Для изменения обязательного уровня целостности существующего объекта вам потребуется SeRelabelPrivilege. Если вы работаете с правами администратора, вы должны иметь возможность включить SeRelabelPrivilege, чтобы внести изменения. Если нет, я думаю, вам нужно будет указать уровень целостности при создании объекта. –
... или вы можете отменить процесс и выполнить процесс с низкой целостностью, чтобы создать сопоставление памяти, а процесс среды-целостности открыть его. –
Ах, право, но работа с правами администратора для меня не вариант :(Я думал, что я указываю уровень целостности при создании объекта (объект безопасности переходит в MemoryMappedFile.CreateNew в процессе целостности среды). С другой стороны, этот второй вариант, о котором вы говорили, может работать, я попробую его сегодня вечером. Спасибо! – Ollhak