【Windows系统】windows服务

news2024/11/24 11:07:59

概述

Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。

服务安装与卸载

通过代码启动。

第一步、创建服务

BOOL Install()
{
    //打开服务控制管理器
    hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 
    //创建服务
    SC_HANDLE hService = ::CreateService(hSCM,
                                    szServiceName,
                                    szServiceName,
                                    SERVICE_ALL_ACCESS,
                                    SERVICE_WIN32_OWN_PROCESS,
                                    SERVICE_AUTO_START,
                                    SERVICE_ERROR_NORMAL,
                                    szFilePath,
                                    NULL,
                                    NULL,
                                    _T(""),
                                    NULL,
                                    NULL);
 
    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);
}

第二步、主函数ServiceMain()

调用 RegisterServiceCtrlHandler 来注册服务的控制函数, 这里要设置status.dwControlsAccepted 为 SERVICE_ACCEPT_STOP,否则你不能控制服务状态。

void WINAPI ServiceMain()
{
    // Register the control request handler
    status.dwCurrentState = SERVICE_START_PENDING;
    status.dwControlsAccepted = SERVICE_ACCEPT_STOP;//这个要使用,否则你不能控制
 
    //注册服务控制
    hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceCtrl);
 
    if (hServiceStatus == NULL)
    {
        LogEvent(_T("Handler not installed"));
        return;
    }
 
    SetServiceStatus(hServiceStatus, &status);
 
    status.dwWin32ExitCode = S_OK;
    status.dwCheckPoint = 0;
    status.dwWaitHint = 0;
    status.dwCurrentState = SERVICE_RUNNING;
 
    SetServiceStatus(hServiceStatus, &status);
 
    //主要业务
    Work();
 
    //
    status.dwCurrentState = SERVICE_STOPPED;
    SetServiceStatus(hServiceStatus, &status);
    LogEvent(_T("Service stopped"));
}

第三步、服务控制函数

服务调用RegisterServiceCtrlHandler或者RegisterServiceCtrlHandlerEx函数来注册它的服务控制函数ServiceCtrl()。

void WINAPI ServiceCtrl(DWORD dwControl)
{
    switch (dwControl)
    {
    case SERVICE_CONTROL_PAUSE:
        ServiceStatus.dwCurrentState = SERVICE_PAUSED;
        break;
 
    case SERVICE_CONTROL_CONTINUE:
        ServiceStatus.dwCurrentState = SERVICE_RUNNING;
        break;
 
    case SERVICE_CONTROL_STOP:
    case SERVICE_CONTROL_SHUTDOWN:
        ServiceStatus.dwCurrentState = SERVICE_STOPPED;
        ServiceStatus.dwCheckPoint = 0;
        ServiceStatus.dwWaitHint = 0;
        SetServiceStatus(hStatus, &ServiceStatus);
        return;
 
     default:
        break;
    }
     
    // 重设服务状态
    SetServiceStatus(hStatus, &ServiceStatus);
    return;
}

第四步、卸载

BOOL Uninstall();
{
    //打开服务控制管理器
    SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 
    //打开服务
    SC_HANDLE hService = OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);
 
    //停止服务
    ControlService(hService, SERVICE_CONTROL_STOP, &status);
 
    //删除服务
    DeleteService(hService);
 
    …
}

服务安装成功

1、输入services.msc,启动 服务。

2、任务管理器,查看进程信息。服务一般都是以SYSTEM权限运行。

3、服务安装成功后,注册表位置

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\XxxService

参考

  通过sc指令创建和删除服务参考:

​​​​​​【Windows脚本】服务的创建和删除_sunriver2000的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++算法:多源最短路径(Floyd)

文章目录 前言一、Floyd算法二、代码实现总结 前言 前文单源最短路径Dijkstra中我们讨论了如何解决有向无环图的最短路径问题,Dijkstra只能解决一个起始点的问题,如果要解决每个顶点到任一顶点的最短路径呢?一个方法就是再循环一次&#xff…

ASEMI代理光宝高速光耦LTV-60L规格,LTV-60L封装

编辑-Z LTV-60L参数描述: 型号:LTV-60L 封装:LSOP-6 储存温度TST:-55~125℃ 工作温度TA:-40~105℃ 隔离电压VISO:5000VRMS 电源电压VCC:7V 平均正向输入电流IF:20mA 输入功…

电脑滤镜软件哪个好 滤镜调色有什么技巧

无论是图片还是视频,滤镜的作用都很大,通过滤镜改变色彩,能让图片或视频增加故事性和美感。电脑滤镜软件哪个好, 电脑滤镜软件有很多,这里我们主要介绍几款视频滤镜软件。滤镜调色有什么技巧?有模板的,我们…

api-hook,更轻量的接口测试工具

目录 前言 现状 api-hook优势 研发介绍 最后 前言 api-hook是一种轻量级的接口测试工具,它基于Python语言编写,可以通过配置文件定义接口测试用例,支持HTTP和HTTPS协议,并提供了灵活的校验机制和数据处理方式。 在网站的开发过…

Tailwindcss 入门

Tailwindcss 是一个功能类优先的 CSS 框架,通过 flex, pt-4, text-center 和 rotate-90 这种原子类组合快速构建网站,而不需要离开你的 HTML。就是记住原子类,不要再自己想 CSS 命名一股脑子写 HTMl 就行了! 它与常规的 Bootstra…

佩戴舒适度极好的蓝牙耳机推荐,久戴不累的蓝牙耳机推荐

无论是在日常还是运动的场景下,我们通常都会选择佩戴着耳机,让我们能够释放压力,缓解枯燥的生活。可是,随着市面上的蓝牙耳机层出不穷、各种各样,导致很多小伙伴不知如何选购耳机了,下面我来给大家分享几款…

循踪讲述:成都的夜,有一盏灯为你亮

成都的夜晚总是这样,热闹而梦幻。霓虹灯下的酒吧一条街,你看着手里冒着蒸汽的小龙虾,却心里想着那个人。那个曾经一起在脚手架上挥汗如雨,携手走过平淡岁月,然后在灯红酒绿的生活里逐渐远离的人。 他,一个手…

【数据治理-06】做好数据分类分级,为数据安全有序流动保驾护航

我们常说人以类聚,物以群分,确实是这样,杜威说过“所有知识都是分类”!很好理解,分类是认知经济,任何有效分类,都可以极大地节省我们的认知精力。数据分类分级具体说来,其实包含了2个…

欢迎来到 VOXEL WARS!

Sandbox Streams 的全新节目,我们希望你们能参与其中! 我们正在寻找 15 名 Voxedit 艺术家,他们将需要抽出 1 小时进行现场表演(仅限屏幕共享),并在节奏快速的环境中进行创作,以赢得“最佳快速设…

报道 | 7月国际运筹优化会议汇总

七月召开会议汇总: 30th International Annual EurOMA Conference Location:Leuven Important dates: Conference: July 3, 2023 - July 5, 2023 Details:https://euroma2023.org/ The Equilibrium Computation Workshop at EC Location:Kings College London…

STM32速成笔记—ADC

文章目录 一、什么是ADC二、ADC的用途三、STM32F103ZET6的ADC3.1 ADC通道对应引脚3.2ADC时钟3.3 ADC工作模式3.4 ADC转换时间3.5 ADC校准3.6 ADC转换结果与实际电压的换算 四、ADC配置步骤五、ADC配置程序5.1 ADC初始化程序5.2 软件触发AD转换5.3 读取AD转换结果 六、实战项目6…

运动健身APP开发需要具备哪些功能?

想要开发一款运动健身APP软件,需要具备哪些功能呢? 1、用户注册和登录:用户通过个人信息注册健身APP,登陆之后建立个人账号,以后使用秩序登录自己的账号就可以记录和追踪自己的健身计划和成果。 2、个人…

【新星计划回顾】第六篇学习计划-通过自定义函数和存储过程模拟MD5数据

🏆🏆时间过的真快,这是导师回顾新星计划学习的第六篇文章! 最近这段时间非常忙,虽然导师首次参与新星计划活动已经在4月16日圆满结束,早想腾出时间来好好整理活动期间分享的知识点。 🏆&#x1…

机器学习:问题构建及框架化

机器学习作为一种解决方案,并不是“万金油”,它只适用于一些特定的场景。在实际应用中,我们首先需要进行问题构建——即通过分析问题以隔离需要解决的各个元素的过程。问题构建有助于确定项目的技术可行性,并提供一组明确的目标和…

应届生软件面试自我介绍(合集)

应届生软件面试自我介绍篇【1】 尊敬的领导: 您好! 我是中南大学(原中南工业大学)冶金科学与工程学院2014年轻金属冶金专业应届毕业生。在此临近毕业之际,我希望能得到贵单位的赏识与栽培。为了发挥自己的才能,特向贵单位自荐。自我介绍 中南…

在元宇宙上做传统建筑施工培训提高培训安全性和效果

随着VR虚拟现实技术不断发展,VR元宇宙在建筑行业中的应用也越来越广泛。通过VR元宇宙技术打通虚拟空间和现实空间实现建筑全生命周期的改进和优化,形成全新的数字建造体系,达到降低成本、提高生产效率、高效协同的效果,促进建筑业…

SignalR 跨域问题(Vue3+Net6)

文章目录 背景困难~~*调用 UseCors*~~ 解决办法环境错误信息解决方式部分代码 问题分析 背景 使用前后端分离技术,前端使用Vue,部署在独立的服务器上,后端接口部署在另外一个服务器上。 困难 网上找了一个多小时的SignalR的跨域问题&#…

textract OCR的安装使用

安装 pip install textract使用 在 Python 中,textract 是一个用于提取文本和信息的库。它提供了一个函数 textract.process(),用于处理不同类型的文档并提取文本内容。下面是 textract.process() 函数的各个参数的介绍: filename&#xf…

spring boot框架步骤

目录 1. 创建一个新的Spring Boot项目2. 添加所需的依赖3. 编写应用程序代码4. 配置应用程序5. 运行应用程序6. 编写和运行测试7. 部署应用程序 总结 当使用Spring Boot框架开发应用程序时,以下是一些详细的步骤: 1. 创建一个新的Spring Boot项目 使用…

ChatGPT在物流与运输行业的智能场景:智能调度和自动驾驶的前瞻应用

第一章:引言 随着人工智能技术的飞速发展,物流与运输行业正迎来一场革命。传统的调度和运输模式已经无法满足快速增长的物流需求和客户期望。在这一领域,ChatGPT作为一种先进的自然语言处理模型,具有巨大的潜力。本文将探讨ChatG…