windows下不同权限进程间通信
我最近在开发过程中发现由于采用的是共享内存进行通信的,这就会导致system用户和普通用户的命名句柄是没法同步了,有什么好办法解决嘛?
普通用户下的 \Sessions\1\BaseNamedObjects_cond_sem__waiter_cond___CC_CONN__dddddd_ipc_server system用户下的 BaseNamedObjects_cond_sem__waiter_cond___CC_CONN__dddddd_ipc_server 我目前在句柄名上加了Global\,但是创建出来的还是有问题
低权限用户对高权限创建的共享内存好像只能读,不能写,这样的话我现在的ipc机制肯定没办法连接了…… 可能需要针对低权限搞一个只读模式才能解决。
是的 共享内存有访问权限的问题,最后自己搞了个基于iocp的ipc
同样的问题,改成Global后,低权限能给高权限发,能收到;但高权限的给低权限发收不到,低权限在创建 FileMapping时失败了 0x5
mark,在现有master分支上比较麻烦
hi,最近在一个新的issue里出了类似的问题(issue-105),但他的问题是windows服务和普通进程之间的交互,本质应该不是权限问题,我的解决方案最终还是加上Global前缀,不清楚对本问题是否有影响。
如果我的方案两位其实尝试过,对次问题没帮助,那这个issue后面的方案应该还是必须想办法加只读的监听channel才能解决。
pr:https://github.com/mutouyun/cpp-ipc/pull/106
加 Global 确实能解决一部分服务进程与普通进程通信问题,但也会引入一些新问题。 如果普通进程带 uac,那很好,一切正常。如果没有 uac 权限,那他无法创建文件映射,只能在带 uac 权限的同 channel 创建后,才能创建(打开,能打开应该是因为创建时调整了安全描述低权限也能打开)。所以在用法上会有限制,每次 receiver 实例需要重新构造,才能把文件映射搞出来。 不幸的是,貌似两个低权限进程无法通信,因为他们谁也无法把 global 文件映射创建出来。 目前我这边最终的方案是 sender、receiver 创建时指定 uac_mode(对应创建带不带 global 的文件映射),接收方根据自身是否高权限创建 receiver,同时如果要发给不带 uac 的进程,就创建不带 global的 sender,反之亦然。 @mutouyun