检查Windows服务状态 – 我需要什么权限

我想在不同的远程服务器上检查一些Windows服务状态,如下所示:

ServiceController sc = new ServiceController("MyWindowsService", "COMPUTER_NAME"); var status = sc.Status 

但我不(也不能)在这些服务器上拥有管理员权限。

我应该要求检查状态的权利是什么?

  • 我也不想重启它们,我只需要Read access,
  • 应用程序未在同一台计算机上运行。

非管理员用户可以远程连接到服务控制管理器,只要他们具有“从网络访问此计算机”用户权限。 默认情况下,此权限授予所有用户。

每个服务上的ACL控制对单个服务的访问。 您必须已经知道服务名称,因为非管理员用户无法远程枚举服务。

服务的默认安全描述符如下:

 D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD) 

您可以使用sc sdshow命令确定服务的安全描述符。 字符串格式在MSDN上的安全描述符定义语言中描述 。

好吧,让我们扩展出安全描述符字符串。 这有点棘手,因为SDDL权限和等效安全管理器权限之间的映射似乎没有在MSDN或SDK标头中得到很好的记录; 幸运的是,Wayne Martin已经为我们完成了繁重的工作,并将结果发布在非管理员的博客条目Service Control Manager Security中 。

 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,它控制审计的内容。 我们目前对此并不感兴趣。

您会注意到没有适用于非管理远程用户的允许权限。 要为特定用户提供远程访问权限,请为该用户添加具有与交互式用户相同权限的allow 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。)