在非管理员帐户上OpenSCManager()函数返回null

时间:2010-07-19 08:14:20

标签: c++

请尽快帮助我。 我正在编写一个c ++代码来运行服务,它在管理员帐户上运行正常 但在非管理员用户帐户上,OpenSCManager()函数返回null。 请告诉我如何授予非管理员用户帐户启动和停止服务的权限。 或者我是否需要做其他事情。 请尽快回复

1 个答案:

答案 0 :(得分:12)

可能您正在调用OpenSCManager指定SC_MANAGER_ALL_ACCESS标志,这实际上需要一组默认情况下仅向管理员提供的权限。要在此处启动/停止服务,您只需指定SC_MANAGER_CONNECT标志,该标志默认授予任何经过身份验证的用户。

现在您已拥有服务管理器的句柄,您必须使用OpenService来获取服务的句柄。要获得启动/停止服务的权限,您应指定GENERIC_READ | GENERIC_EXECUTE作为所需的访问权限(实际上我认为您甚至可以缩小SERVICE_STARTSERVICE_STOP所需的权限,如有必要, SERVICE_INTERROGATE)。

此处是问题:标准服务DACL不向普通用户授予此类权限,因此您应该更改启动所需服务的DACL,以允许普通用户启动/停止;见here。有关服务访问权限的更多信息,请参阅here

如果您希望允许普通用户启动/停止任何服务,而不是单个服务,我不知道是否可以在不更改所有DACL的情况下实现,但在我看来,这绝对是一个坏主意。

请注意,即使在单一服务案例中,如果服务在特权帐户(例如LocalSystem)下运行,或者如果它是重要的系统服务,那么让非特权用户搞砸它仍然是个坏主意。您应该允许用户仅启动/停止对系统不重要的服务。

出于好奇,为什么需要让用户启​​动/停止服务?