无法启动 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。
我尝试使用 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。