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

时间:2014-11-03 22:26:20

标签: c# security windows-services

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

ServiceController sc =  new ServiceController("MyWindowsService", "COMPUTER_NAME");

var status = sc.Status

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

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

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

1 个答案:

答案 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。)