C# 检查Windows服务状态-我需要什么特权

C# 检查Windows服务状态-我需要什么特权,c#,security,windows-services,C#,Security,Windows Services,我想检查不同远程服务器上的某些Windows服务状态,如下所示: ServiceController sc = new ServiceController("MyWindowsService", "COMPUTER_NAME"); var status = sc.Status 但是我在这些服务器上没有(也不能)管理员权限 我应该要求什么权利来检查状态 我也不想重新启动它们,我只需要读访问权限 应用程序未在同一台计算机上运行 非管理员用户可以远程连接到服务控制管理器,前提是他们拥有“从网络

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

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

var status = sc.Status
但是我在这些服务器上没有(也不能)管理员权限

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

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

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

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

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

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
您可以使用
sc sdshow
命令确定服务的安全描述符。MSDN中介绍了字符串格式

好的,让我们展开安全描述符字符串。这有点棘手,因为SDDL权限和等效的security manager权限之间的映射似乎没有在MSDN或SDK头中得到很好的记录;幸运的是,韦恩·马丁已经为我们完成了繁重的工作,并将结果发布在了博客上

由于所有条目都是允许条目,因此顺序并不重要;为了方便起见,我会把它们从小到大列出

(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

如果这是您自己的服务,则可以在使用该功能安装服务时更改权限。您还可以使用此函数编写程序来更改现有服务的权限

或者,您可以在命令行中使用
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将保留。)

通过“不同的服务器”,您的意思是通过网络检查远程服务器的状态吗?也就是说,您的代码不是在运行服务的同一台计算机上运行的?@HarryJohnston我编辑了我的问题以回答您的问题。启动或停止服务只需要最低权限。如果您遇到问题,那么可能的问题是目标计算机上的用户帐户未知。@HansPassant我有权访问远程计算机上的一些文件夹,但我不知道检查服务状态需要哪些权限?谢谢您提供的详细答案,我将尝试并告诉您!
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)