WindowsNT下Service的编程

驾驶分代扣分

驾驶分代扣分

2016-02-19 12:39

有了下面这个WindowsNT下Service的编程教程,不懂WindowsNT下Service的编程的也能装懂了,赶紧get起来装逼一下吧!

  ----此例中原程序使用Delphi编制,老妖将之改成CB版。:D
  
  ----WindowsNTServer提供多种功能强大的服务(Service),例如FTP,WWW或远程登录服务,另外常用的数据库服务器也是以Service的形式存在于NTServer上的,如Sybase SQLServer For NT。Service一般在NT启动时自动启动,在NT关机时停止。但是有时用户可能想手工启动、暂停、停止某项Service,这就需要在控制面板中进行配置,对于不太熟悉NT的用户来说比较困难;对于软件开发人员,有时需要在软件中访问和操作某项Service,甚至可能需要开发新Service的提供给用户使用。上面两种情况都可以通过对Service的编程来解决。对Service的编程涉及到NT的内核,比较复杂且相关资料较少,给软件开发人员带来很多困难,笔者通过对WindowsNT的API的分析找到了相应的编程方法,再此介绍给大家。
  
  ----在WindowsNT下,各种Service都存在service control manager database中,因此我们可以通过对service control manager database进行操作来实现对Service的编程。下面介绍常用的函数:
  
  1:SC_HANDLE OpenSCManager(LPCTSTR lpszMachineName,LPCTSTR lpszDatabaseName,DWord fdwDesiredAccess);
  
  ----Open SCManager 函数打开指定计算机上的service control manager database。其中参数lpszMachineName指定计算机名,若为空则指定为本机。参数lpszDatabaseName指定要打开的service control manager database,默认为空。
  
  ----参数fdwDesiredAccess指定操作的权限,可以为下面取值之一
  
  SC_MANAGER_ALL_ACCESS        //所有权限
  SC_MANAGER_CONNECT           //答应连接service control manager
  SC_MANAGER_CREATE_SERVICE    //答应创建服务对象并把它加入service control manager database
  SC_MANAGER_ENUMERATE_SERVICE //答应枚举service control manager database中的服务
  SC_MANAGER_LOCK              //答应锁住service control manager database
  SC_MANAGER_QUERY_LOCK_STATUS //答应获取servicecontrolmanagerdatabase的封锁信息
  
  ----函数返回值:函数执行成功则返回一个指向service control manager database的句柄,失败则返回NULL。
  
  2:SC_HANDLE OpenService(SC_HANDLE schSCManager,LPCTSTR lpszServiceName,DWORD fdwDesiredAccess);
  
  ----OpenService函数打开指定的Service。
  ----其中参数schSCManager是指向service control manager database的句柄,由OpenSCManager函数返回。
  ----参数lpszServiceName要打开的服务的名字,注重大小写。
  ----参数fdwDesiredAccess指定操作的权限,可以为下面取值之一
  
  SERVICE_ALL_ACCESS            //所有权限
  SERVICE_CHANGE_CONFIG         //答应更改服务的配置
  
   SERVICE_ENUMERATE_DEPENDENTS  //答应获取依靠于该服务的其他服务
  SERVICE_INTERROGATE            //答应立即获取服务状态
  SERVICE_PAUSE_CONTINUE        //答应暂停和唤醒服务
  SERVICE_QUERY_CONFIG           //答应获取服务配置
  SERVICE_QUERY_STATU            //答应通过访问service control manager获取服务状态
  SERVICE_START                  //答应启动服务
  SERVICE_STOP                   //答应停止服务
  SERVICE_USER_DEFINE_CONTROL    //答应用户指定非凡的服务控制码
  
  
  ----函数返回值:函数执行成功则返回指向某项服务的句柄,失败则返回NULL。
  
  3:BOOL QueryServiceStatus(SC_HANDLE schService,LPSERVICE_STATUS lpssServiceStatus);
  
  ----QueryServiceStatus函数返回指定服务的当前状态。
  ----其中参数schService是指向某项服务的句柄,由OpenService函数返回,且必须SERVICE_QUERY_STATUS的权限。
  ----参数lpssServiceStatus中存放返回的服务状态信息,结构如下
  typedefstrUCt_SERVICE_STATUS
  {
      DWORD dwServiceType;        //服务类型
      DWORD dwCurrentState;        //当前状态
      DWORD dwControlsAccepted;    //服务可接受的控制码
      DWORD dwWin32ExitCode;        //Win32出错代码
      DWORD dwServiceSpecificExitCode;//服务出错代码
      DWORD dwCheckPoint;            //用于跟踪服务长时间操作
      DWORD dwWaitHint;             //服务某一操作的最大答应时间,以毫秒为单位
  }SERVICE_STATUS,*LPSERVICE_STATUS;
  
  ----函数返回值:函数执行成功则返回True,失败则返回False。
  
  4:BOOLStartService(SC_HANDLE schService,DWORD dwNumServiceArgs,LPCTSTR * lpszServiceArgs);
  
  ----StartService函数启动指定的服务。
  ----其中参数schService是指向某项服务的句柄,由OpenService函数返回,且必须有SERVICE_START的权限。
  ----dwNumServiceArgs为启动服务所需的参数的个数。
  ----lpszServiceArgs为启动服务所需的参数。函数返回值:函数执行成功则返回True,失败则返回False。
  
  5:BOOL ControlService(SC_HANDLE hService,DWORD dwControl,LPSERVICE_STATUS lpServiceStatus);
  
  ----ControlService函数向Win32service发送控制码。
  ----其中参数hService是指向某项服务的句柄,由OpenService函数返回。
  ----参数dwControl为控制码,常用的有
      SERVICE_CONTROL_STOP     //停止服务
      SERVICE_CONTROL_PAUSE    //暂停服务
  
       SERVICE_CONTROL_CONTINUE    //唤醒暂停的服务
      SERVICE_CONTROL_INTERROGATE//刷新某服务的状态
  ----参数lpServiceStatus指向SERVICE_STATUS结构,用于存放该服务最新的状态信息。
  ----函数返回值:函数执行成功则返回True,失败则返回False。
  
  6:BOOL EnumServicesStatus(SC_HANDLE hSCManager,DWORD dwServiceType,DWORD dwServiceState,LPENUM_SERVICE_STATUS lpServices,DWORD cbBufSize,LPDWORD pcbBytesNeeded,LPDWORD lpServicesReturned,LPDWORD lpResumeHandle);
  
  ----EnumServicesStatus函数用于枚举NT下存在的Service。
  ----其中参数hSCManager是指向service control manager database的句柄,由OpenSCManager函数返回,且必须有SC_MANAGER_ENUMERATE_SERVICE的权限。
  ----参数dwServiceType指定按服务的类型枚举。
  ----参数dwServiceState指定按服务的状态枚举。
  ----参数lpServices指向ENUM_SERVICE_STATUS结构,用于存放返回的服务的名字和状态信息。
  ----参数cbBufSize返回参数lpServices的长度,以字节为单位。
  ----参数pcbBytesNeeded返回获取剩余的Service所需字节的个数。
  ----参数lpServicesReturned返回服务的个数。
  ----参数lpResumeHandle,当第一次调用时该参数为0,当该函数再次被调用以获取另外的信息时,该参数表示下一个被读的Service。
  ----函数返回值:函数执行成功则返回True,失败则返回False。
  ----值得注重的是通常情况下该函数返回的结果为FALSE,我们可以调用GetLastError()来获取进一步信息。因为一台机器上有多种服务存在,所以GetLastError()应为ERROR_MORE_DATA,此时应再次调用EnumServicesStatus函数以获取正确的Service列表。
  
  ----下面有一个用Delphi编的一个程序例子,用其他开发工具如VC,VB也可实现。程序运行时,单击按钮Button1枚举NT中的Service并显示在列表框ListBox1中。在ListBox1选中某个Service,单击按钮Button2则启动该Service,单击按钮Button3则停止该Service。
  
  首先在Unit1.hpp中添加
  #include winsvc.hpp
  然后在Class Form1的Private中添加
  
  SC_HANDLE hscmanager,hService;
  TServiceStatus returnstatus;
  
  以下是Unit1.cpp的内容:
  /************
展开更多 50%)
分享

猜你喜欢

WindowsNT下Service的编程

编程语言 网络编程
WindowsNT下Service的编程

Linux下的多线程编程

编程语言 网络编程
Linux下的多线程编程

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Linux 下的多进程编程

编程语言 网络编程
Linux 下的多进程编程

浅析.Net下的多线程编程

电脑网络
浅析.Net下的多线程编程

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Delphi下的COM编程技术简介

Delphi
Delphi下的COM编程技术简介

windows service的创建方法

电脑入门
windows service的创建方法

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Win10显卡驱动修改后数字签名没有了该怎么办

Win10显卡驱动修改后数字签名没有了该怎么办

Word2024新功能 让排版、布局变得更简单

Word2024新功能 让排版、布局变得更简单
下拉加载更多内容 ↓