我想检查不同远程服务器上的某些Windows服务状态,如下所示:
ServiceController sc = new ServiceController("MyWindowsService", "COMPUTER_NAME");
var status = sc.Status
但我不(也不能)在这些服务器上拥有管理员权限。
我应该要求检查状态有什么权利?
答案 0 :(得分:2)
非管理员用户可以远程连接到服务控制管理中心,前提是他们具有“从网络访问此计算机”用户权限。默认情况下,此权限授予所有用户。
对每项服务的访问权限由每个服务上的ACL控制。您必须已经知道服务名称,因为非管理员用户无法远程枚举服务。
服务的默认安全描述符如下:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
您可以使用sc sdshow
命令确定服务的安全描述符。字符串格式在MSDN上的Security Descriptor Definition Language中描述。
好的,让我们扩展出安全描述符字符串。这有点棘手,因为SDDL权限和等效的安全管理器权限之间的映射似乎没有在MSDN或SDK标头中详细记录;幸运的是,Wayne Martin已经为我们完成了繁重的工作,并将结果发布在博客文章Service Control Manager Security for non-admins中。
D: - this part is the DACL, the permissions on the service.
由于所有条目都是允许条目,因此订单不重要;为方便起见,我会将它们列为最少特权。
(A;;CCLCSWLOCRRC;;;IU) - allow the interactive user the following rights:
CC - SERVICE_QUERY_CONFIG (the right to query the service configuration)
LC - SERVICE_QUERY_STATUS (the right to query the service status)
SW - SERVICE_ENUMERATE_DEPENDENTS (the right to see service dependencies)
LO - SERVICE_INTERROGATE (the right to send SERVICE_CONTROL_INTERROGATE)
CR - SERVICE_USER_DEFINED_CONTROL (the right to send a user defined control)
RC - READ_CONTROL (the right to see the permissions)
(A;;CCLCSWLOCRRC;;;SU) - allow services the following rights:
same as for the interactive user
(A;;CCLCSWRPWPDTLOCRRC;;;SY) - allow local system the following rights:
same as for the interactive user, plus:
RP - SERVICE_START (the right to start the service)
WP - SERVICE_STOP (the right to stop the service)
DT - SERVICE_PAUSE_CONTINUE (the right to send pause and continue requests)
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA) - allow the Administrators group:
same as for local system, plus:
DC - SERVICE_CHANGE_CONFIG (the right to reconfigure the service)
SD - DELETE (the right to delete the service)
WD - WRITE_DAC (permission to change the permissions)
WO - WRITE_OWNER (permission to take ownership)
安全描述符字符串(S:(...)
)的第二部分是SACL,它控制审计的执行。我们目前对此并不感兴趣。
您会注意到没有适用于非管理远程用户的允许权限。要为特定用户提供远程访问权限,请为该用户添加一个与交互式用户具有相同权限的允许ACE。
如果这是您自己的服务,则可以在使用SetServiceObjectSecurity功能安装服务时更改权限。您还可以使用此函数编写程序以更改现有服务的权限。
或者,您可以在命令行中使用sc sdset
来基于SDDL字符串设置现有服务的权限。您首先需要为用户查找SID字符串;在域中,您可以使用Active Directory用户和计算机执行此操作。可以通过“属性编辑器”选项卡在objectSid属性中查看SID字符串。 (遗憾的是,您不能以这种方式复制和粘贴。建议您更方便地查找用户的SID。)
例如,如果SID字符串为S-1-5-21-131085535662-8349591032-725385543-5981
,则命令行为
sc sdset myservice D:(A;;CCLCSWLOCRRC;;;S-1-5-21-131085535662-8349591032-725385543-5981)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)
(您无需指定SACL;如果不存在,将保留现有的SACL。)