【发布时间】:2022-01-18 15:22:15
【问题描述】:
我有一个使用 MemoryMappedFiles 进行进程间通信的服务。它多年来一直运行良好,并且是在 .NET Framework 4.6.1 中开发的。现在是将代码移植到 .NET 6 的时候了。除了一个问题:内存映射文件的安全 ACL 之外,我已经让大部分代码都能正常工作。这个论点似乎在 .NET 6 中消失了。 这是 4.6.1 框架版本的 sn-p
fs = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
FileSecurity fSec = File.GetAccessControl(FileName);
fSec.AddAccessRule(new FileSystemAccessRule("everyone", FileSystemRights.FullControl, AccessControlType.Allow));
File.SetAccessControl(FileName, fSec);
if (fs.Length == 0)
fs.SetLength(_SectionSize);
long fLen = fs.Length;
MemoryMappedFileSecurity security = new MemoryMappedFileSecurity();
security.AddAccessRule(new AccessRule<MemoryMappedFileRights>("everyone", MemoryMappedFileRights.FullControl, AccessControlType.Allow));
//Name = @"Global\DCCCache"; // "Global\" when running as a service so session 0 stuff available to everyone
_MMFHandle = MemoryMappedFile.CreateFromFile(fs, Name, _SectionSize, MemoryMappedFileAccess.ReadWrite, security, HandleInheritability.Inheritable, false);
_VAHandle = _MMFHandle.CreateViewAccessor();
这一切都有效,并允许非管理员用户进程访问内存映射文件。
.NET 6 从.CreateFromFile 方法中删除了 security 参数。因此,只有以管理员权限运行的进程才能访问内存映射文件。对于非管理员进程,MemoryMappedFile 的 OpenExisting 方法会引发“拒绝访问”IO 异常。
当我创建内存映射文件以便非管理员进程可以访问时,有没有办法修改安全性?
【问题讨论】:
-
感谢您的链接。讨论看起来像 6 中特别缺少该功能,并希望添加它。除非我没有看到它,否则最近在实施它方面没有任何动静。
标签: c# access-denied memory-mapped-files .net-6.0