我试图在中等完整性进程上创建 MemoryMappedFile,然后在低完整性子进程上打开相同的文件,并将此共享内存用于 IPC。没有真正的磁盘文件(使用MemoryMappedFile.CreateNew)。
我的问题是低完整性进程无法打开共享内存,抛出以下错误:“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:客户端不持有所需的权限。”。无论如何,我不太确定这是正确的方法,我不太清楚 Win32/C++ 示例如何转换为 C#...
有人知道更多关于这件事吗?