C++-windows跨进程权限问题

C++-windows跨进程权限问题

归属感 发布于 2016-11-26 字数 347 浏览 1212 回复 3

我在服务端创建了一段共享内存。并把exe生成服务后台运行。
客户从IE访问服务器,将数据通过网页提交上来,服务器得到网页参数后,建立一个COM对象访问exe的共享内存,然后将在共享内存中的查询结果返回给客户。
问题是现在无法用COM对象访问exe的共享内存,提示访问拒绝 。我在本地经过测试工作流程肯定没有问题,问题肯定在权限方面,我该如何解决?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夜无邪 2017-10-07 3 楼

如果是服务程序创建映射,CreateFileMapping的第2参数不要赋值为NULL,因为NULL表示使用当前进程默认的安全描述符,一般应用程序无权访问。可以创建一个安全描述符,添加everyone用户组的访问权限。
如果由应用程序创建映射,应该不会有这样的问题。

可以参考:进程访问共享内存的权限问题

清晨说ぺ晚安 2017-04-19 2 楼

找到问题所在了,需要在创建共享内存时指定一个安全描述符,增加一个新的访问控制项目(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

灵芸 2017-03-22 1 楼

这个问题是因为权限问题造成的,可以从两个方面来考虑:
1)共享内存的创建时创建一个其他所有程序都能访问的共享内存
2)另外一个是提升服务者的权限,比如把访问者变成具有管理员权限的角色,这样就能访问该共享内存