我尝试在中等完整性进程上创建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#...
任何人都对此有更多了解吗?
答案 0 :(得分:1)
好的,得到了一个有效的解决方案。有两个问题:
将一个空的MemoryMappedFileSecurity对象传递给MemoryMappedFile.CreateNew()使得映射的内存即使在同一进程中也无法访问。这解释了我在评论中的错误(“System.UnauthorizedAccessException:拒绝访问路径”)。
我实际上无法让security.SetSecurityDescriptorSddlForm
工作(即使谷歌在此展示了其他一些尝试,但它们都没有为我工作)。相反,我使用了这个解决方案:https://stackoverflow.com/a/14424623/5105846。据我所知,它做了同样的事情,但改为使用PInvoke。所以我刚刚调用了InterProcessSecurity.SetLowIntegrityLevel(file.SafeMemoryMappedFileHandle)
,它使它可以从低完整性子进程访问。成功了!
不是完美的解决方案,但我现在需要的是一个有效的解决方案。谢谢Harry的帮助!