




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、前不久 , 为完成项目中某个功能 , 需要写个 windows 服务程序 , 定时来调用另外的一个 exe 程 序 , 完成过程遇到颇多问题 , 作为初学者 , 分享一下我的整个过程 . 参考了多位大神的文章 . 资 料来自网上 , 最后给出链接 . 表示感谢以下是一些基本知识 , 不得不耐下心去理解 , 这对程序理解和编写非常用帮助 .首先 Microsoft Windows 服务(即,以前的 NT 服务使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动, 可以暂停和重新启动而且不显示任何用户界面。 这使服务非常适合在服务器上使用
2、, 或任何 时候, 为了不影响在同一台计算机上工作的其他用户, 需要长时间运行功能时使用。 还可以 在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。服务是有状态的, 当我们使用 windows 自带的服务管理程序 sc.exe 查看服务状态时可以显 示服务的当前状态, 这个状态是由我们在程序代码中进行控制的。 你最好在服务初始化的时 候将服务设置为 SERVICE_START_PENDING,当初始化完毕时设为SERVICE_RUNNING,这些状态是系统自定义的状态, 可通过 msdn 查看其他状态。 这个状态信息你会在 sc.exe 中看到。在编写 windows 服
3、务程序过程中你需要关注的函数有:1. 首先是 main 函数, 由于 windows 服务不需要界面, 所以大部分程序为 win32控制台应用 程序,所以程序主函数为 main 而不是 WinMain(。在主函数要做的主要工作就是初始化一 个 SERVICE_TABLE_ENTRY 分派表结构体, 然后调用 StartServiceCtrlDispatcher(;这将 把调用进程的主线程转换为控制分派器。 该分派器启动一个新线程, 该线程运行分派表中对 应于你的服务的 ServiceMain (函数。 ServiceMain (函数将在下面提到。此过程示例代码如下:SERVICE_TABLE_
4、ENTRY entrytable2;entrytable0.lpServiceName="testservice"entrytable0.lpServiceProc=(LPSERVICE_MAIN_FUNCTIONServiceMain;entrytable1.lpServiceName=NULL;entrytable1.lpServiceProc=NULL;StartServiceCtrlDispatcher(entrytable;在这之后系统将自动创建一个线程去执行 ServiceMain 函数的内容, 你应该将你要执行的任 务在 ServiceMain 中循环,这样服
5、务就开始运行了。2. ServiceMain 函数为 void WINAPI ServiceMain(int argc, char* argv格式的函数,函 数名字可以任意定义。 它的作用就是:将你需要执行的任务放到该函数中循环执行即可。 这就是服务程序的工作函数。在 ServiceMain 执行你的任务前,需要给SERVICE_TABLE_ENTRY 分派表结构体进行赋值, 注意由于此时服务还没有开始执行你的任务所以我们将服务的状态设置 为 SERVICE_START_PENDING,即正在初始化。我们进行如下赋值: servicestatus.dwServiceType = SERVICE
6、_WIN32;servicestatus.dwCurrentState = SERVICE_START_PENDING; servicestatus.dwControlsAccepted=SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCE PT_STOP;/在本例中只接受系统关机和停止服务两种控制命令servicestatus.dwWin32ExitCode = 0;servicestatus.dwServiceSpecificExitCode = 0;servicestatus.dwCheckPoint = 0;servicestatus.dwWaitHint = 0;
7、hstatus = :RegisterServiceCtrlHandler("testservice", CtrlHandler;CtrlHandler 为 void WINAPI CtrlHandler(DWORD request型的函数,函数名字可以任意设 定。将在下一点讲到。Hstatus 为 SERVICE_STATUS_HANDLE 类型的全局变量。当需要改变服务状态时 SetServiceStatus (函数需要它做为参数来标识一个服务。3. void WINAPI CtrlHandler(DWORD request,函数的主要功能是,接收系统传递的控制 命令,
8、 比如当你通过 sc.exe 关闭服务时, 该函数会收到 SERVICE_CONTROL_STOP消息, 你就可以对服务进行必要的管理。在本例子程序中就只接收SERVICE_ACCEPT_SHUTDOWN 和SERVICE_ACCEPT_STOP消息, 这是通过前面给 servicestatus 赋值设定的。 这样一个基 本的服务程序就完成了。本文结束的时候会附上如何安装服务。当服务程序需要使用某些功能时,由于用户的关系而受到限制,比如访问注册表的 HKEY_CURRENT_USER键,使用网络等等,这时候就需要以当前登陆用户的身 份去进行操作,通常会创建一个进程来完成需要的功能。如果使用 C
9、reateProcess, 来创建进程的话,新创建的进程和服务程序依然是相同的用户身份,还是无法达到 目的,只有使用 CreateProcessAsUser 了。但 CreateProcessAsUser 的第一个参 数是 HANDLE hToken , 该参数通常应该用 LogonUser 来获得,但是 LogonUser 又需要用户名和用户密码,这样就很不现实。那应该怎么办呢?我想到了一个方法 可以绕过 LogonUser 直接获得 hToken 。 因为用户已经登陆,那么肯定有 Shell (就 是 EXPLORER.EXE 运行了, 我们可以通过遍历进程来取得 Shell 的 hToken 来运 然后安装服务运行 cmd.exe输入以下 :sc create your_service_name binpath= D:backupGetXML.exe /这步注意等号右边有 个空格sc start your
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度不动产投资信托合同协议
- 2025年度夫妻财产约定与家庭财务规划协议书模板
- 2025年度公厕保洁与智能设备维护服务合同
- 2025年度房屋遗产继承与遗产分配及税务筹划协议
- 2025年度单价合同在新能源技术研发中的合同履行与经济效益
- 2025年度定向委培协议书:新材料研发人才定向培养协议
- 2025年度农村自来水用户用水纠纷处理合同
- 2025年度建筑材料经销商返点奖励协议
- 2025年度劳动合同协商解除协议书-企业转制员工安置协议
- 4S店装饰维修服务合同
- 外研版三年级下册英语全册教案(2024年2月修订)
- 《人文科学概论》课件
- 大学生返回母校宣讲
- 光伏机器人行业报告
- 屋顶分布式光伏发电施工组织设计
- 践行志愿服务(下)
- 环境监测课件20-在线环境监测技术
- 《纸杯变变变》课件
- JGJT178-2009 补偿收缩混凝土应用技术规程
- 一般工业固体废物分类及利用处置方式(2020年)
- 汽车人才需求调查研究报告
评论
0/150
提交评论