背景
我有2个Windows服务(在WinServer2016上运行(通过共享内存进行通信。该映射用DuplicateHandle
Windows API从一个服务到另一个服务传播(这是首选方法的原因(。
当服务在本地系统帐户下运行时,一切都很好,但是如果我们在专用的管理员帐户下运行它们,则映射通过失败:OpenProcess
报告访问被拒绝。
查看processExplorer中接收器进程的属性/安全/权限/高级面板我确实看到process_dup_hanlde允许本地系统允许并禁止管理组。如果我用cppchecksd将流程的安全描述符转:
,我会发现完全一样。O:BAG:SYD:(A;;0x1fffff;;;SY)(A;;0x121411;;;BA)S:AI(ML;;NWNR;;;SI)
问题
我想将ACE添加到接收机过程中,该进程允许process_dup_handle到由创建者帐户运行的任何过程(这两个服务都使用相同的帐户运行(。我想在服务创建时间进行此操作。
sc
可以选择并设置服务的安全描述符(SD(,但我无法真正解释sc sdshow
的结果:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
此DACL有4个条目(与上面的2个分类相比(,并且管理组的权利多于系统。
- 对我来说似乎是过程SD!= Service SD,对吗?
-
sc
设置的SD对应是什么? - 我可以使用
sc sdset
添加所需的权限吗?
Process SD和Service SD不是相同的事情。前者定义了该过程的权限(process_dup_handle在其中(。Service SD定义了服务上的另一组权限,例如开始,停止,查询状态(请参阅:设置Windows服务权限(。因此,它告诉谁可以通过您的服务来做。不可能使用sc sdset
修改过程SD。
使这一点令人困惑的是,ACE条目中访问掩码位的解释取决于我们正在检查的SD的对象的类型。例如,0x0040表示一个进程的process_dup_hanlde,但表示服务的service_pause_continue(Windows对象的访问权限(。
在该MS的顶部将SDDL定义为SD的易于阅读(DUH!(表示。SDDL将每个访问掩码位映射到与文件系统相关权限的2个字母缩写,并且根本不反映对象依赖性解释。这就是为什么sc sdshow
显示List_children(LC(或Delete_tree(DT(等权限,这些权限在服务的上下文中没有含义。
关于原始问题(使用副本API(,我最终使用getSecurityInfo/setEntriesInacl/setSecurityInfo api将客户端进程中的权限添加到服务器用户。