我有一组Win32应用程序,它们使用CreateFileMapping() 和创建的共享内存段共享信息MapViewOfFile().其中一个应用是系统服务; 其余部分由登录用户启动.在Windows XP上,没有问题.我们将我们的片段命名为"Global\Something",一切都很好.
Vista中的额外安全性(以及假设的Windows 7)似乎阻止了这种架构的运行.不允许普通用户在全局命名空间中创建(Win32错误5)对象.MSDN表明,如果该帐户具有"创建全局"权限,那么一切都应该很好,但实际上似乎并非如此.此外,Vista的"完整性"功能似乎可以防止"低完整性"用户进程访问"高完整性"服务创建的共享内存对象.看起来我应该能够通过一些神奇的SetSecurityDescriptorSacl()咒语解决这个问题,但是我很难学会说话.
所以问题是:在服务和普通用户进程之间使用共享内存段的正确方法是什么?
为了取代"只是关闭UAC"的简单回答,我们处于一个相当封闭的环境中,这是不可能的.
编辑:服务和用户进程都需要对段进行读/写访问.