我正在尝试编写一个应用程序,该应用程序作为服务器上的本地用户运行,并且需要访问枚举服务,甚至可能控制它们(启动/停止)。
作为管理员组的一部分仅有的该用户能够访问此功能的方式(通过服务控制器类)?如果更简单的话,我甚至能够枚举服务列表 (交互式启动/停止并不麻烦)。将用户添加到高级用户组是否可行?
谢谢!
答案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 start
或Get-Service
您可以更改服务控制管理器上的权限以允许您的进程枚举服务。您还需要更改要访问的任何服务的权限。
我刚写了一个博客文章关于如何执行此操作,它包括一个 PowerShell 脚本,用于对本地计算机上的所有服务执行此操作。
答案4
嗯,这完全取决于您用于查询进程的语言,但所需的用户角色将由您的代码在目标机器上需要的一组权限决定。其中一些权限与普通用户帐户相关联,而其他权限则需要管理员角色。