服务创建服务 - 将 SC_MANAGER_CREATE_SERVICE 分配给用户

Posted

技术标签:

【中文标题】服务创建服务 - 将 SC_MANAGER_CREATE_SERVICE 分配给用户【英文标题】:Services Creating Services - Assigning SC_MANAGER_CREATE_SERVICE to a User 【发布时间】:2016-12-09 00:35:27 【问题描述】:

我正在尝试创建一个有权创建其他服务的 Windows 服务。但我不希望使用管理登录名运行此服务。

否则用户权限非常有限 - 我只需要它能够根据请求启动服务。

我看到网上提到 SC_MANAGER_CREATE_SERVICE 是您现在可以分配和/或更改的权限,但我没有看到太多关于如何完成的内容。提到能够通过 subinacl、OpenSCManager 和 - gulp - sc 命令更改单个服务的权限。但这些示例展示了如何更改单个服务的权限,而不是如何授予用户 SC_MANAGER_CREATE_SERVICE 权限。

但是,我注意到 CreateService 上的文档明确指出它需要管理员权限 - 所以也许根本不可能。

我是否必须使用管理员帐户启动服务?或者有谁知道另一个技巧?

【问题讨论】:

是因为什么原因你不能使用 LocalService 帐户? CreateService() 文档中的任何内容都没有明确说明需要管理员权限(尽管这是有道理的,因为它写入注册表中的HKEY_LOCAL_MACHINE),只有OpenSCManager() 必须调用SC_MANAGER_CREATE_SERVICEdwDesiredAccess 参数中指定。 【参考方案1】:

见Service Security and Access Rights:

要获取或设置 SCM 的安全描述符,请使用带有 SCManager 对象句柄的 QueryServiceObjectSecurity 和 SetServiceObjectSecurity 函数。

请注意,拥有创建服务的权限会为您提供有效的管理员访问权限,因为您可以创建服务以作为本地系统运行。因此,您确实需要注意不要将该权限授予不受信任的用户可以访问的帐户,以确保所有具有该权限的帐户都具有强密码,等等。

这也意味着,如果您的系统服务受到远程代码执行漏洞的影响,您还没有获得任何东西,攻击者仍然能够控制您的系统。如果该服务面临直接攻击的高风险,那么明智的做法是让第二个服务只负责需要特殊权限的任务。但是,对于不太可能受到直接攻击或被认为相当安全的服务,在没有管理员权限(创建服务的能力除外)的情况下运行可能会阻止不太严重的漏洞被利用,或限制由非- 与安全相关的错误。

另请参阅服务器故障上的Granting service control manager access permission to user outside of administrator group,答案显示如何从命令行更改 SCM 权限。

【讨论】:

以上是关于服务创建服务 - 将 SC_MANAGER_CREATE_SERVICE 分配给用户的主要内容,如果未能解决你的问题,请参考以下文章

如何从函数创建服务?

我需要将创建的视频发送到 ziggeo 的网络服务

C# 无法创建将启动的 Windows 服务

创建新的 systemd 服务时,何时需要将 RemainAfterExit 选项设置为 true?

创建 Windows 服务的指南?

Spring认证指南|了解如何创建异步服务方法。