我尝试使用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
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:1)
由于可执行文件位于您的个人文档文件夹中,因此本地服务帐户无权访问它。
最简单的解决方案是更改Debug文件夹的权限,以便在启用继承的情况下提供SERVICE读取和执行访问权限。从命令行:
icacls Debug /grant SERVICE:(OI)(CI)(RX)
(由于Windows不在默认配置中进行遍历检查,因此您无需更改父文件夹的权限。)
另一种选择是将可执行文件复制到公共位置(例如Program Files内部)并在那里安装,但是每次重新编译时都必须记住手动更新副本。
编辑:根据您的建议,另一个选项是将帐户更改为本地系统,以便该服务以管理权限运行。最佳实践是以最少的权限运行服务,但在这个阶段它并不重要。
答案 1 :(得分:0)
@Pumkko提供的评论有助于解决问题......服务帐户被指定为LocalService(#define SERVICE_ACCOUNT L"NTAUTHORITY\\LocalService"
)。来自here:
本地服务帐户没有输出.exe的权限 文件,这就是错误发生的原因。
我将帐户类型更改为LocalSystem(#define SERVICE_ACCOUNT L"LocalSystem"
),现在可以启动我的服务了。
Thankyou @Pumkko和@Harry Johnston。