如何在c#中使用服务和用户界面应用之间的共享内存?

问题描述 投票:0回答:1

如果我在服务中写以下内容:

mmfKernel = MemoryMappedFile.CreateNew("Global\\myMMF", 1024);

并在用户应用程序中关注:

MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("Global\\myMMF");

我拒绝访问全局mmf。如何向具有所有可能权限的所有人授予对mmfKernel的访问权限?

但是反过来,当我获得SeCreateGlobalPrivilege之后,在用户应用中执行以下操作:

mmfKernel = MemoryMappedFile.CreateNew("Global\\myMMF", 1024);

并且正在服役:

MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("Global\\myMMF");

即使我已经拥有SeCreateGlobalPrivilege,在创建mmfKernel时,我也会得到路径访问拒绝。如何以普通用户而非管理员身份创建它?

c# memory semaphore shared
1个回答
0
投票

如果它们在不同的用户帐户下运行,并且您认为内存映射文件是您的用例的不错的IPC,则应使用另一个CreateNew版本,该版本接受具有权限的MemoryMappedFileSecurity参数。

这里是创建访问控制列表以向所有人授予完全控制权限的方法:

var sid = new SecurityIdentifier( WellKnownSidType.WorldSid, null );
var ace = new AccessRule<MemoryMappedFileRights>( sid,
                            MemoryMappedFileRights.FullControl, AccessControlType.Allow );
var acl = new MemoryMappedFileSecurity();
acl.AddAccessRule( ace );

然后将acl对象传递给MemoryMappedFile.CreateNew方法。

考虑您实际需要的权限。如果您的桌面进程仅需要对共享文件的读取访问权限,请相应地更改访问规则。另外,最好使用更具体的受托人代替所有人,例如AuthenticatedUserSid(=“经过身份验证的用户”)代替WorldSid(=“每个人”),也许使用特定的用户帐户或安全组。

© www.soinside.com 2019 - 2024. All rights reserved.