C++-windows跨进程权限问题
我在服务端创建了一段共享内存。并把exe生成服务后台运行。
客户从IE访问服务器,将数据通过网页提交上来,服务器得到网页参数后,建立一个COM对象访问exe的共享内存,然后将在共享内存中的查询结果返回给客户。
问题是现在无法用COM对象访问exe的共享内存,提示访问拒绝 。我在本地经过测试工作流程肯定没有问题,问题肯定在权限方面,我该如何解决?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果是服务程序创建映射,CreateFileMapping的第2参数不要赋值为NULL,因为NULL表示使用当前进程默认的安全描述符,一般应用程序无权访问。可以创建一个安全描述符,添加everyone用户组的访问权限。
如果由应用程序创建映射,应该不会有这样的问题。
可以参考:进程访问共享内存的权限问题
找到问题所在了,需要在创建共享内存时指定一个安全描述符,增加一个新的访问控制项目(ACE)给进程的拥有者。默认的访问控制列表(ACL)只包含创建者和管理员组。
类似如下代码:
SECURITY_ATTRIBUTES sa;
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, // Current file handle.
sa, // 这里要把sa进行一些设置,以便进程可以访问.
// NULL,
PAGE_READWRITE, // Read/write permission.
0, // Max. object size.
FileSize, // Size of hFile.
MapName); // Name of mapping object.
相关资料:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa379560(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa446595(v=vs.85).aspx
这个问题是因为权限问题造成的,可以从两个方面来考虑:
1)共享内存的创建时创建一个其他所有程序都能访问的共享内存
2)另外一个是提升服务者的权限,比如把访问者变成具有管理员权限的角色,这样就能访问该共享内存