network setup service启动后自动停止_Windows 网络编程:启动服务项

一次性进群,长期免费索取教程,没有付费教程。

教程列表见微信公众号底部菜单

进微信群回复公众号:微信群;QQ群:460500587


9e0a4fa1f84f3038f6bdd823ce57247f.png

微信公众号:计算机与网络安全

ID:Computer-network

服务是一种在操作系统启动时就启动的进程。在操作系统启动时有两种程序会一起随着系统启动,一种是普通的Win32程序,另一种是驱动程序。这里讨论的并不是要如何编写一个系统的服务,而是编写一个如何可以显示出这些随系统启动而启动的服务项。

一、如何查看系统服务

在Windows下,有很多服务是跟随操作系统一起进行启动的,具体有哪些服务是跟随操作系统一起启动的呢?如何查看呢?其实非常得简单。在“我的电脑”上单击鼠标右键,然后在弹出的菜单上选择“管理”命令会打开“计算机管理”工具,单击左侧树形列表中的“服务和应用程序”会出现一个列表,选择“服务”则在右侧出现了服务项列表,如图1所示。

c78c55f46d4b4886f3ff7bbef78ad788.png

图1  Windows下的服务管理程序

在这个列表中,只能查看到Win32应用程序的服务,无法查看关于驱动程序的服务。我们可以借助其他一些小工具来查看驱动服务的程序,如图2所示。

c2dedaeb67720dd68b974101f8e0e7c2.png

图2  使用SREng查看驱动服务程序列表

接下来编写一个程序,既可以查看应用程序服务列表,也可以查看驱动程序服务列表。编写的程序如图3所示。

2e6a543785a6d520509603b63b5e4afc.png

图3  服务管理程序的界面

这个服务控制管理器依然是使用MFC的对话框进行开发的,其中还是用到了CListCtrl这个控件。让我们现在就动手开始打造一个自己的服务控制管理器吧。

二、服务控制管理器的开发

服务控制管理器的开发和注册表启动管理器的开发是差不多的,主要也是枚举服务并将其显示到列表控件中。至于对服务状态的控制,是通过服务相关的API函数来完成的。这次,我们先来看代码,希望通过阅读代码大家能自己掌握与服务相关的API函数。在代码的后面,会对开发服务控制管理器涉及到的API进行相应的解释。

学习API函数的使用,最好的老师是MSDN。在大家学习编程的道路上,要通过阅读大量的代码来提高自己的编程能力,那时大家就要自行学习API函数的使用,因此希望大家能养成好的学习习惯,也就是自己能够独立查阅MSDN来进行API函数的使用。

我们要枚举的服务分为“Win32服务应用程序”和“驱动程序”两类。对于枚举这两类服务,只是枚举函数的参数有所不同,这个函数参数是系统定义的两个常量,定义分别如下:

4f01694363bcbc658decc063e21b550f.png

看一下服务枚举时的代码:

f7155abeba20c9eeceecfc6db39c629f.png

该成员函数有一个参数,这个参数就是用来指明是枚举“Win32应用程序服务”,还是用来枚举“驱动程序服务”的。也就是我们前面提到的两个系统定义的常量了,参数根据两个常量的不同,枚举到的服务也不同。

三、枚举服务的相关API函数

打开服务管理器:

a2164f547558fffbd4c35437c915bb66.png

参数说明如下。

(1)lpMachineName:指向欲打开服务控制管理器数据库的目标主机名,本机则设置为NULL。

(2)lpDatabaseName:指向了目标主机SCM数据库名字的字符串。

(3)dwDesiredAccess:指定对SCM数据库的访问权限。

这里介绍一下,SCM是服务控制管理器的意思,它是系统服务的一个组成部分,跟我们开发的软件不是一个概念。由于我们不是编写一个具体的服务,而只是对系统现有的服务进行一个枚举,因此,一些概念性的知识希望大家可以自行查阅相关的资料。

该函数调用成功,返回一个SCM句柄,否则返回NULL。

关闭服务句柄:

b2ad77c4e597bfd12353e64cd8cb7427.png

该函数用来关闭OpenSCManager()和OpenService()打开的句柄。

枚举服务:

6f90e27e751eaffd507554d17d323470.png

参数说明如下。

(1)hSCManager:OpenSCManager()函数返回的句柄。

(2)dwServiceType:指定枚举的服务类型,也就是我们自定义函数的那个参数。

(3)dwServiceState:枚举指定状态的服务。

(4)lpService:指向ENUM_SERVICE_STATUS类型的指针。

(5)cbBufSize:指定缓冲区的大小。

(6)pcbBytesNeeded:返回实际使用的内存空间大小。

(7)lpServicesReturn:返回枚举服务的个数。

(8)lpResumeHandle:返回枚举是否成功。

33c31ad2241b44e0d85182aa7b8485cd.png

四、服务的停止

对于枚举到的服务,对我们来说只有两种操作,一种是启动服务,另一种是停止服务。系统中有很多我们不用的服务,它会随着电脑的启动而启动,这样既会影响系统的启动速度,也会占用宝贵的系统资源,因此,没用的系统服务要停掉。先来看看停止系统服务的代码。

b0434f75d050d0d71674e5f2bd14b5dc.png

五、停止服务的相关API函数

打开服务函数:

2a8175ceff34af1a81dd045e6ec5ce4d.png

参数说明如下。

(1)hSCManager:指定由OpenSCManager()函数打开的服务句柄。

(2)lpServiceName:指向要打开的服务的名称。

(3)dwDesiredAccess:对要打开服务的访问权限。

控制服务函数:

a70fe99df87d1a63111bac3e7b00e8dd.png

参数说明如下。

(1)hService:指定一个由OpenService()打开的服务句柄。

(2)dwControl:指定了要发送的控制码,ControlService()可以对服务进行多种控制,每种控制对应一种控制码。

(3)lpServiceStatus:用于返回服务的状态。

六、服务的启动

启动服务的代码与停止服务的代码类似。这里简单地给出启动服务的部分代码,具体的代码自己动手写写。启动服务的部分代码如下:

48361df18da42961b29bb5eac36754ff.png

启动服务相关API函数解释:

2fbd78c8bf88f005e995296e801a4b2c.png

参数说明如下。

(1)hService:指定了要启动服务的句柄。

(2)dwNumServiceArgs:指向了启动服务所需的参数个数。

(3)lpServiceArgVectors:指向了启动服务的参数。

该函数最后两个参数类似main(int argc, char *argv[])中的两个参数的作用。

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值