无法启动 C++ Windows 服务

Unable to start a C++ Windows Service

我尝试使用 this code sample on MSDN 在 C++ 中创建 Windows 服务。我在 Visual Studio 2013 年以管理员身份打开了解决方案文件。构建成功。然后,我按照代码示例提供的说明,从以管理员身份打开的命令提示符下安装了该服务。该服务现在显示在我系统的服务工具中。但是,当我尝试启动该服务时,我得到 error 5: Access is denied.

sc qc CppWindowsService的输出结果如下:

    [SC] QueryServiceConfig SUCCESS

    SERVICE_NAME: CppWindowsService
    TYPE               : 10  WIN32_OWN_PROCESS
    START_TYPE         : 3   DEMAND_START
    ERROR_CONTROL      : 1   NORMAL
    BINARY_PATH_NAME   : C:\Users\Aaa\Documents\CppWindowsService\C++\Debug\CppWindowsService.exe
    LOAD_ORDER_GROUP   :
    TAG                : 0
    DISPLAY_NAME       : CppWindowsService Sample Service
    DEPENDENCIES       :
    SERVICE_START_NAME : NT AUTHORITY\LocalService

为什么会发生这种情况,我该如何解决?

由于可执行文件位于您的个人文档文件夹中,因此本地服务帐户无权访问它。

最简单的解决方法是更改​​ Debug 文件夹的权限以授予 SERVICE 读取和执行访问权限,并启用继承。从命令行:

icacls Debug /grant SERVICE:(OI)(CI)(RX)

(因为Windows默认配置不做遍历检查,所以不需要更改父文件夹的权限。)

另一种选择是将可执行文件复制到 public 位置(例如 Program Files 内)并在那里安装,但您必须记住每次重新编译时手动更新副本。

编辑: 还有一个选项,正如您所建议的,是将帐户更改为本地系统,以便该服务具有 运行 管理权限。最佳做法是 运行 服务具有最低限度的必要权限,但在这个阶段这并不重要。

@Pumkko 提供的评论帮助解决了问题...服务帐户被指定为 LocalService (#define SERVICE_ACCOUNT L"NTAUTHORITY\LocalService")。来自 here:

The Local Service account didn't have permissions to the output .exe file, and this was why the error was occuring.

我将帐户类型更改为 LocalSystem (#define SERVICE_ACCOUNT L"LocalSystem"),现在我的服务可以启动了。

谢谢@Pumkko 和@Harry Johnston。