C++使用API操作服务(不用SC)

一般来说,服务的基本操作有注册(创建)、启动、暂停、停止、卸载操作,下面分别介绍服务的注册(创建)、启动、停止以及卸载操作。

在介绍服务的基本操作前,不得不提一个概念, 即服务管理器(services.exe),服务管理器的主要工作是管理操作系统上的所有服务,其中包括跟踪、维护服务的各种状态,以及对服务发起具体的操作。开发者可以通过服务管理器来查询服务状态、修改服务配置、注册(创建)新服务、启动服务等。而实际上,上面提及到的服务基本操作,都是基于服务管理器的操作,换句话说,开发者通过API (应用程序编程接口)操作服务,API内部首先会通过一一个称为“LPC”(本地方法调用)的方式,把请求发送给服务管理器,服务管理器再处理具体的请求。
1、打开服务管理器

SC_HANDLE WINAPI OpenSCManager(
    LPCTSTR lpMachineName, //机器的名字,NULL表示本机的服务管理器
    LPCTSTR lpDatabaseName,//数据库的名字,NULL表示打开的是一一个活动数据库
    DWORD dwDesireAccess);

第三个参数比较关键,为一个DWORD类型的值,表示权限。开发者通过服务管理器去操作服务时,不同的操作需要不同的权限。常用的服务管理器权限有:
SC_MANAGER_CREATE_SERVICE: 表示拥有注册(创建)服务的权限。
SC_MANAGER_ENUMERATE_SERVICE: 表示拥有枚举系统服务的权限。
SC_MANAGER_ALL_ACCESS:表示拥有一切权限。
当这个服务管理器句柄不再需要使用,开发者需要调用CloseServiceHandle()来关闭句柄。
2、服务的创建

SC_ HANDLE WINAPI CreateService(
  SC_ HANDLE hSCManager, //服务管理器句柄
  LPCTSTR lpServiceName, //要创建服务的名字
  LPCTSTR lpDisplayName, //服务显示的名字
  DWORD dwDesiredAccess, //服务的权限,返回的句柄要启动服务使用的权限
  DWORD dwServiceType, //服务的类型
  DWORD dwStartType ,//服务的启动方式
  DWORD dwErrorControl ,//服务的错误控制
  LPCTSTR lpBinaryPathName,//服务的可执行文件全路径
  LPCTSTR lpLoadOrderGroup ,//服务所在分组的名字,可为NULL
  LPDWORD lpdwTagId,//服务所在分组内的标识,可为NULL
  LPCTSTR lpDependencies,//服务依赖的服务,可为NULL
  LPCTSTR lpServiceStartName ,//以什么身份启动服务,可为NULL
  LPCTSTR lpPassword//那个身份的密码,可为NULL
);

当这个服务句柄不再需要使用,开发者需要调用CloseServiceHandle()来关闭句柄。
3、服务的启动与停止
启动服务

BOOL WINAPI StartService(
  SC_ HANDLE hService, //服务句柄
  DWORD dwNumServiceArgs,//启动参数,同 argc
  LPCTSTR *IpServiceArgVectors//启动参数,同 argv[]
);

停止服务

BO0L WINAPI ControlService(
  sc HANDLE hService, //服务句柄
  DWORD dwControl,//控制码,停止,挂起。。。
  LPSERVICE_ STATUS lpServiceStatus//返回的参数,返回被控制的服务的最新状态
);

4、服务的删除

BOOL WINAPI DeleteService(
   SC_HANDLE hService //服务的句柄
);

5、例子

#include "stdafx. h"
#include "windows .h"
#define SER NAME _T("FirstDriver")int main()
SC_ HANDLE hSCM = NULL;
SC_ HANDLE hSer = NULL ;
do{
  hSCM = OpenSCManager( NULLNULL,SC_ _MANAGER _CREATE SERVICE );
  if( hSCM == NULL ){
    break;
  }
  //TCHAR *p = SER_ NAME;
  hSer = CreateService(
  hSCM,//句柄
  SER_ NAME ,//服务名称
  SER_ NAME,//服务显示的名字
  SERVICE_ ALL ACCESS,//所有权限打开
  SERVICE_ KERNEL _DRIVER,//内核 类型的服务
  SERVICE_ DEMAND_ START,//服务启动类型,这里是手动启动
  SERVICE_ ERROR_ IGNORE,//错误类型
  _T("C:\\FirstDriver. sys"),//sys文件所在的磁盘目录
  NULL,//服务所在的组,不关心顺序,传递NULL
  NULL,//服务的Tag,这里不关心,传递NULL
  NULL,//服务的依赖,这里没有依赖,传递NULL
  NULL,//服务的启动用户名,传递NULL
  NULL);//服务启动用户名对应的密码,传递NULL
  if( hSer == NULL )
  {
    DWORD dwErrorCode = GetLastError();
    if( dwErrorCode == ERROR_ SERVICE_ EXISTS ) //ERROR SERVICE_ EXISTS 表示服务已经存在,不能重复注册,属于正常的情况
      {
       hSer = OpenService( hSCM , SER NAME , SERVICE_ ALL_ ACCESS );
       if( hSer == NULL ){
         //打开失败
         break;
       }
     }
    else
    {
      break;
    }
  }
  printf("CreateService or OpenService succ n");
  getchar();
  //准备启动服务
  BOOL bSucc = StartService( hSer , NULL , NULL );
  printf("StartService:%uln" , bSucc );
  getchar();
  //停止服务
  SERVICE_ STATUS SerStatus = [o];
  bSucc = ControlService( hSer , SERVICE_ CONTROL_ STOP , &SerStatus );
  printf("ControlService:%un" ,bSucc );
  getchar();
  //下面开始删除服务
  DeleteService( hSer );
 }
 while( FALSE );
 if( hSCM != NULL )
 {
   CloseServiceHandle( hSCM );
   hSCM = NULL;
 }
 if( hSer != NULL )
 {
   CloseServiceHandle( hSer );
   hSer = NULL;
  }
 return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海鸥的诀别诗

谢谢,龙咬会继续努力的!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值