我试图在中等完整性进程上创build一个MemoryMappedFile,然后在低完整性的subprocess上打开同一个文件,并将这个共享内存用于IPC。 没有真正的磁盘文件(使用MemoryMappedFile.CreateNew)。
我的问题是,低完整性的进程不能打开共享内存,抛出:“System.UnauthorizedAccessException:访问path被拒绝。” 我并不感到惊讶,因为我想从低完整性的过程写入访问权限,但是如何授予它访问权限呢?
这是我的代码:
中等诚信stream程:
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); }
如果两个过程都以中等完整性工作,则工作正常 读完这个之后 ,我尝试在中等完整性过程中设置SDDLstring,如下所示:
security.SetSecurityDescriptorSddlForm("S:(ML;;NW;;;LW)");
但是这给了我另一个例外,这次创build了内存映射文件:“System.IO.IOException:所需的特权不被客户端持有”。 不知道这是否是正确的方法,我不清楚Win32 / C ++如何转换为C#
任何人都知道更多关于这个?
好的,有一个工作的解决方案。 有两个问题:
传递一个空的MemoryMappedFileSecurity对象到MemoryMappedFile.CreateNew()使映射的内存不可访问,即使对同一个进程。 这解释了我的错误在我的评论(“System.UnauthorizedAccessException:访问路径被拒绝”)。
我实际上无法得到security.SetSecurityDescriptorSddlForm
工作(即使谷歌显示其他几个尝试,没有人为我工作)。 相反,我使用这个解决方案: https : //stackoverflow.com/a/14424623/5105846 。 据我所知,它做同样的事情,但使用PInvoke来代替。 所以我只是调用InterProcessSecurity.SetLowIntegrityLevel(file.SafeMemoryMappedFileHandle)
,并使其可以从低完整性的子进程访问。 成功!
不是完美的解决方案,但现在只需要一个工作。 感谢Harry的帮助!