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

标签 c# security windows-services

我想像这样检查不同远程服务器上的某些 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 命令确定服务的安全描述符。 Security Descriptor Definition Language 中描述了字符串格式在 MSDN 上。

好的,让我们扩展该安全描述符字符串。这有点棘手,因为 SDDL 权限和等效安全管理器权限之间的映射似乎没有在 MSDN 或 SDK header 中得到很好的记录;幸运的是,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 用户和计算机来执行此操作。 SID 字符串可以通过属性编辑器选项卡在 objectSid 属性中查看。 (不幸的是,您不能那样复制和粘贴。欢迎提供有关查找用户 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。)

关于c# - 检查 Windows 服务状态 - 我需要什么权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724423/

相关文章:

c# - 在XAML中将CollectionViewSource与CompositeCollection结合使用

c# - 无法引用项目对其运行单元测试

security - 什么更安全?我应该向用户发送包含过期 URL 的电子邮件以重置其密码,还是应该通过电子邮件发送新生成的密码?

c# - 当它位于生成的分部类中时如何处理 dispose

c# - 在 .NET 7 中使用具有最少 API 的 MapGroup

c# - F# 看不到 C# 可序列化抽象类的抽象属性

c++ - 防御用户脚本的堆栈溢出

java - 我们什么时候在 spring security 中使用 denyAll

c# - 安装 Windows 服务 - 没有错误,但它不在服务控制管理器中

c# - 无法捕捉屏幕