本地用户查询服务所需的权限

本地用户查询服务所需的权限

我正在尝试编写一个应用程序,该应用程序作为服务器上的本地用户运行,并且需要访问枚举服务,甚至可能控制它们(启动/停止)。

作为管理员组的一部分仅有的该用户能够访问此功能的方式(通过服务控制器类)?如果更简单的话,我甚至能够枚举服务列表 (交互式启动/停止并不麻烦)。将用户添加到高级用户组是否可行?

谢谢!

编辑:http://msdn.microsoft.com/en-us/library/windows/desktop/ms685981(v=vs.85).aspx#access_rights_for_the_service_control_manager

答案1

高级用户组永远不是答案。这是一个古老的遗留问题。最好认为它不存在。

如果你想以细粒度的方式设置单个 Windows 服务的权限,你可以这样做,但它远不如设置文件权限那么简单/直观

要查看 Windows 服务的当前权限:

C:\Users\Ryan>sc sdshow netlogon

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCR
RC;;;IU)(A;;CCLCSWLOCRRC;;;SU)

例如,设置单个 Windows 服务的权限,以便非管理员用户可以启动和停止特定服务:

sc sdset netlogon "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;S-1-5-21-2103278432-2794320136-1883075150-1000)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
[SC] SetServiceObjectSecurity SUCCESS

这看起来糟透了,不是吗?这个东西叫做 SDDL - 安全描述符定义语言。

本文是关于如何解释 SDDL 和执行您要执行的操作的非常好的入门知识。

您还可以使用安全模板和组策略来完成同样的事情:

安全模板

答案2

另一个完成相同任务的友好选项是 Windows 2003 资源工具包中包含的 subinacl 命令行工具。这是一个非常棒的小技巧。

以下是设置服务用户权限的语法:

SUBINACL /SERVICE \\MachineName\ServiceName /GRANT=[DomainName\]UserName[=Access]

以下是可用的访问选项:

F : Full Control
R : Generic Read
W : Generic Write
X : Generic eXecute
L : Read controL
Q : Query Service Configuration
S : Query Service Status
E : Enumerate Dependent Services
C : Service Change Configuration
T : Start Service
O : Stop Service
P : Pause/Continue Service
I : Interrogate Service 
U : Service User-Defined Control Commands

因此,要授予组 DOMAIN\GroupName 的成员启动和停止服务 'ServiceName' 的权限,可以执行以下操作:

subinacl /service ServiceName /GRANT=DOMAIN\GroupName=TO

要查看服务“ServiceName”上设置的权限(运行上述操作之前和之后),可以执行以下操作:

subinacl.exe /service /verbose=1 ServiceName

以下是使用 subinacl 设置服务权限的官方 HOWTO: http://support.microsoft.com/kb/288129

以下是 subinacl 的下载链接: http://www.microsoft.com/en-us/download/details.aspx?id=23510

答案3

要枚举服务,您的流程需要SC_MANAGER_ENUMERATE_SERVICE权限,在过去每个经过身份验证的用户都拥有此权限,但从 Vista 开始不再如此。

交互式用户有它,这就是为什么普通用户可以做net startGet-Service

您可以更改服务控制管理器上的权限以允许您的进程枚举服务。您还需要更改要访问的任何服务的权限。

我刚写了一个博客文章关于如何执行此操作,它包括一个 PowerShell 脚本,用于对本地计算机上的所有服务执行此操作。

答案4

嗯,这完全取决于您用于查询进程的语言,但所需的用户角色将由您的代码在目标机器上需要的一组权限决定。其中一些权限与普通用户帐户相关联,而其他权限则需要管理员角色。

相关内容