无法使用net stop命令停止Windows服务

时间:2015-07-14 16:06:51

标签: c++ winapi service

通过执行以下操作,我创建了一个运行良好的Windows服务。

WebClient

正如您所看到的,我将访问权限指定为 SC_HANDLE hService = ::CreateService(*m_ServiceConfig, // SCM database name.c_str(), // name of service displayname.c_str(), // service name to display SERVICE_ALL_ACCESS, // desired access SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, // service type (interactive for debug) SERVICE_AUTO_START, // start type SERVICE_ERROR_NORMAL, // error control type path.c_str(), // path to service's binary nullptr, // no load ordering group nullptr, // no tag identifier dependencies, // dependencies nullptr, // LocalSystem account nullptr); // no password 并且在线此常量表明您有权暂停继续并停止服务,

然而,当我运行命令SERVICE_ALL_ACCESS时,我得到以下输出

  

请求的暂停继续或停止对此服务无效

我的问题是我创建服务的方式有什么问题吗?

服务控制处理程序功能

net stop <service-name>

1 个答案:

答案 0 :(得分:1)

您在dwDesiredAccess CreateService()参数中指定的访问权限对net stop命令没有影响。访问权限仅适用于返回的SC_HANDLE,并影响该句柄与后续API调用的交互方式。

您看到的错误很可能是由于您调用SetServiceStatus()而不包括SERVICE_ACCEPT_STOP字段中的SERVICE_STATUS::dwControlsAccepted标记造成的。

SERVICE_STATUS structure

  

<强> dwControlsAccepted
  服务接受并在其处理函数中处理的控制代码(请参阅HandlerHandlerEx)。用户界面进程可以通过在ControlServiceControlServiceEx函数中指定控制命令来控制服务。默认情况下,所有服务都接受 SERVICE_CONTROL_INTERROGATE 值。要接受 SERVICE_CONTROL_DEVICEEVENT 值,服务必须使用RegisterDeviceNotification函数注册以接收设备事件。

     

以下是控制代码。

     

...

     

<强> SERVICE_ACCEPT_STOP
  00000001

     

可以停止服务。

     

此控制代码允许服务接收 SERVICE_CONTROL_STOP 通知。