我想像这样检查不同远程服务器上的某些 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/