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

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

作为pipe理员组的一部分,这个用户能够访问这个function(通过ServiceController类使用)的唯一方法是? 如果更容易,我甚至可以枚举服务列表(交互式开始/停止不是显示停止)。 将用户添加到高级用户的小组工作?

谢谢!

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

高级用户组决不是答案。 这是一个古老的遗产。 最好只考虑它是不存在的。

如果您想以细粒度的方式在各个Windows服务上设置权限,您可以,但远不如在文件上设置权限那样容易/直观

要查看Windows服务的当前权限,请执行以下操作:

C:\Users\Ryan>sc sdshow netlogon D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCR RC;;;IU)(A;;CCLCSWLOCRRC;;;SU) 

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

 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和做你想做的事情的一个很好的入门。

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

安全模板

另一个友好的做法是做同样的事情是Windows 2003 Resource Kit中包含的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

为了枚举服务,您的进程需要SC_MANAGER_ENUMERATE_SERVICE权限,在过去,每个经过身份validation的用户都有这个权限,但是从Vista开始,情况就不再是这样了。

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

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

我刚刚写了一篇关于如何做到这一点的博客文章 ,它包含一个PowerShell脚本来为本地机器上的所有服务执行此操作。

嗯,这一切都取决于你用来查询进程的语言,但是所需的用户angular色将由你的代码在目标机器上需要的一组权限决定。 其中一些权限与普通用户帐户关联,而其他权限则需要pipe理员权限。