分享
 
 
 

WindowsNT下Service的编程

王朝system·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

----此例中原程序使用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的内容:

/************

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有