Qt重启windows服务

日常开发中,会遇到改变某个服务的参数,并进行重启(例如Redis断电恢复机制)

需要程序拥有UAC权限,并且调用如下API才能对windows服务进行重启:

cpp 复制代码
#include "windows.h"

#pragma comment(lib, "advapi32.lib")

bool ConfigCenter::ReStartServiceByName(std::string strDestServiceName)
{
    bool bServiceStatus     = FALSE;
    SC_HANDLE schSCManager  =  nullptr ;
    SC_HANDLE schService    =  nullptr ;
    DWORD dwBytesNeeded     =  0 ;
    SERVICE_STATUS_PROCESS ssStatus;
    char szSvcName[MAX_PATH] = {0};
    memcpy_s(szSvcName,MAX_PATH,strDestServiceName.c_str(),strDestServiceName.length());
    //! 获取一个服务控制管理器数据库的句柄
    schSCManager = OpenSCManager(
        nullptr ,                           // local computer
        nullptr ,                           // ServicesActive database
        SC_MANAGER_ALL_ACCESS);             // full access rights

    if(schSCManager == nullptr) {
        qDebug() << "OpenSCManager fail" << endl;
        return bServiceStatus;
    }

    //! 获取该服务在服务控制管理器数据库中的句柄
    schService = OpenServiceA(
        schSCManager,                       // SCM database
        szSvcName,                          // name of service
        SERVICE_ALL_ACCESS/* | DELETE*/);   // full access

    if(schService == nullptr) {
        CloseServiceHandle(schSCManager);
        qDebug() << "Get a handle to the service fail" << endl;
        return bServiceStatus;
    }

    //! 查询该服务的当前状态
    if(!QueryServiceStatusEx(
        schService,                         // handle to service
        SC_STATUS_PROCESS_INFO,             // information level
        (LPBYTE) &ssStatus,                 // address of structure
        sizeof (SERVICE_STATUS_PROCESS),    // size of structure
        &dwBytesNeeded ) )                  // size needed if buffer is too small
    {
        CloseServiceHandle(schService);
        CloseServiceHandle(schSCManager);
        qDebug() << "QueryServiceStatusEx fail" << endl;
        return bServiceStatus;
    }
    else
    {
        switch (ssStatus.dwCurrentState)
        {
        case  SERVICE_STOPPED:
        case  SERVICE_STOP_PENDING:
            qDebug() << szSvcName << " Service status is Stop" << endl;
            break ;
        case  SERVICE_PAUSED:
        case  SERVICE_PAUSE_PENDING:
            qDebug() << szSvcName << " Service status is Pause" << endl;
            break ;
        case  SERVICE_CONTINUE_PENDING:
        case  SERVICE_RUNNING:
        case  SERVICE_START_PENDING:
            qDebug() << szSvcName << " Service status is Running" << endl;
            bServiceStatus = TRUE;
            break ;
        }
    }

    //! 停止该服务
    if(bServiceStatus == TRUE) {
        SERVICE_STATUS status;
        if (!ControlService(schService, SERVICE_CONTROL_STOP, &status)) {
            qDebug() << "ControlService failed with error:" << GetLastError();
            return !bServiceStatus;
        }
    }

    //! 启动该服务
    StartService(schService,0,nullptr);
    Sleep(500);

    //! 获得服务的当前状态
    QueryServiceStatusEx(schService,SC_STATUS_PROCESS_INFO,(LPBYTE) &ssStatus,sizeof (SERVICE_STATUS_PROCESS),&dwBytesNeeded );
    if (SERVICE_RUNNING == ssStatus.dwCurrentState)
    {
        bServiceStatus = TRUE;
    }

    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
    return bServiceStatus;
}

参考文章:https://www.cnblogs.com/TechNomad/p/17669231.html

相关推荐
iDao技术魔方4 分钟前
Bun v1.3.12 深度解析:新特性、性能优化与实战指南
开发语言·javascript·visual studio code
charlie11451419116 分钟前
嵌入式C++工程实践——第13篇:第一次重构 —— enum class取代宏,类型安全的开始
开发语言·c++·vscode·stm32·安全·重构·现代c++
jiayong2317 分钟前
第 13 课:分页、页码状态和 URL 同步
开发语言·前端·javascript·vue.js·学习
格林威18 分钟前
AI视觉检测:模型量化后漏检率上升怎么办?
人工智能·windows·深度学习·数码相机·计算机视觉·视觉检测·工业相机
CHANG_THE_WORLD24 分钟前
C++ 文件读取函数完全指南
开发语言·c++
阿正的梦工坊28 分钟前
JavaScript 闭包 × C++ 类比:彻底搞懂闭包
开发语言·javascript·c++
赵优秀一一33 分钟前
SQLAlchemy学习记录
开发语言·数据库·python
无限进步_40 分钟前
【C++】寻找字符串中第一个只出现一次的字符
开发语言·c++·ide·windows·git·github·visual studio
孬甭_1 小时前
字符函数及字符串函数
c语言·开发语言
摇滚侠1 小时前
Java 进阶教程,全面剖析 Java 多线程编程
java·开发语言