背景
我有2个Windows服务(在WinServer2016上运行)通过共享内存进行通信。映射通过DuplicateHandle
Windows API从一种服务传播到另一种服务(这是首选方法的原因)。
虽然服务在本地系统帐户下运行,但一切正常,但是,如果我们在专用的Admin帐户下运行服务,则映射传递失败:OpenProcess
报告访问被拒绝。
在ProcessExplorer中,查看接收方进程的“属性/安全性/权限/高级”面板,我确实看到PROCESS_DUP_HANLDE允许用于本地系统,而不允许用于Admin组。如果我使用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个相比),并且管理组的权限比系统的权限大。
sc
设置的SD对应什么?sc sdset
添加所需的权限吗? 答案 0 :(得分:0)
进程SD和服务SD不同。前者定义了对进程的权限(PROCESS_DUP_HANDLE在其中)。服务SD对服务定义了一组不同的权限,例如启动,停止,查询状态(请参阅:Setting Windows service permissions)。因此,它告诉谁可以使用您的服务做什么。无法使用sc sdset
修改进程SD。
此位混乱的原因是ACE条目中访问掩码位的解释取决于我们要检查其SD的对象的类型。例如,对于进程,0x0040表示PROCESS_DUP_HANLDE,但对于服务(Access rights for Windows objects)则表示SERVICE_PAUSE_CONTINUE。
在那之上,MS将SDDL定义为SD的易读(duh!)表示形式。 SDDL将每个访问掩码位映射为文件系统相关权限的2个字母的缩写,它根本不反映对象相关的解释。这就是sc sdshow
显示诸如LIST_CHILDREN(LC)或DELETE_TREE(DT)之类的权限的原因,这些权限在服务上下文中没有任何意义。
关于原始问题(使用DuplicateHandle API),我最终使用GetSecurityInfo / SetEntriesInAcl / SetSecurityInfo API向服务器用户添加了客户端进程中的权限。