首页 > 系统相关 >如何在MinGW GCC中查询Windows服务的状态?启动、停止 Windows 服务 Demo

如何在MinGW GCC中查询Windows服务的状态?启动、停止 Windows 服务 Demo

时间:2024-03-05 16:02:40浏览次数:21  
标签:scm GCC 服务 SERVICE service Windows Demo printf NULL

使用 MinGW GCC 完成查询 Windows 服务的状态:

#include <windows.h>
#include <stdio.h>

// 查询服务状态的函数
void QueryServiceStatus(const char* serviceName)
{
    SC_HANDLE scm, service;
    SERVICE_STATUS status;

    // 打开服务控制管理器
    scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
    if (scm == NULL)
    {
        printf("OpenSCManager failed, error=%d\n", GetLastError());
        return;
    }

    // 打开指定的服务
    service = OpenService(scm, serviceName, SERVICE_QUERY_STATUS);
    if (service == NULL)
    {
        printf("OpenService failed, error=%d\n", GetLastError());
        CloseServiceHandle(scm);
        return;
    }

    // 查询服务状态
    if (!QueryServiceStatus(service, &status))
    {
        printf("QueryServiceStatus failed, error=%d\n", GetLastError());
    }
    else
    {
        // 输出服务状态信息
        printf("Service %s status:\n", serviceName);
        printf("  State: ");
        switch (status.dwCurrentState)
        {
        case SERVICE_STOPPED:
            printf("Stopped\n");
            break;
        case SERVICE_START_PENDING:
            printf("Start Pending\n");
            break;
        case SERVICE_STOP_PENDING:
            printf("Stop Pending\n");
            break;
        case SERVICE_RUNNING:
            printf("Running\n");
            break;
        // 其他状态的处理
        }
    }

    // 关闭服务句柄和服务控制管理器句柄
    CloseServiceHandle(service);
    CloseServiceHandle(scm);
}

int main()
{
    // 调用查询服务状态的函数
    QueryServiceStatus("MyService");

    return 0;
}

在这个示例中,定义了一个名为QueryServiceStatus的函数,该函数接受服务名称作为参数,并使用Windows API中的函数来查询该服务的状态。在main函数中,调用了QueryServiceStatus函数来查询名为"MyService"的服务的状态。

如何在MinGW GCC中停止和启动Windows服务?

停止Windows服务的示例代码:

#include <windows.h>
#include <stdio.h>

// 停止服务的函数
void StopService(const char* serviceName)
{
    SC_HANDLE scm, service;
    SERVICE_STATUS status;

    // 打开服务控制管理器
    scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
    if (scm == NULL)
    {
        printf("OpenSCManager failed, error=%d\n", GetLastError());
        return;
    }

    // 打开指定的服务
    service = OpenService(scm, serviceName, SERVICE_STOP | SERVICE_QUERY_STATUS);
    if (service == NULL)
    {
        printf("OpenService failed, error=%d\n", GetLastError());
        CloseServiceHandle(scm);
        return;
    }

    // 查询服务状态
    if (!QueryServiceStatus(service, &status))
    {
        printf("QueryServiceStatus failed, error=%d\n", GetLastError());
    }
    else
    {
        // 如果服务正在运行,则停止服务
        if (status.dwCurrentState == SERVICE_RUNNING)
        {
            if (!ControlService(service, SERVICE_CONTROL_STOP, &status))
            {
                printf("ControlService failed, error=%d\n", GetLastError());
            }
            else
            {
                printf("Service %s stopped successfully\n", serviceName);
            }
        }
        else
        {
            printf("Service %s is not running\n", serviceName);
        }
    }

    // 关闭服务句柄和服务控制管理器句柄
    CloseServiceHandle(service);
    CloseServiceHandle(scm);
}

int main()
{
    // 调用停止服务的函数
    StopService("MyService");

    return 0;
}

启动Windows服务的示例代码:

#include <windows.h>
#include <stdio.h>

// 启动服务的函数
void StartService(const char* serviceName)
{
    SC_HANDLE scm, service;
    SERVICE_STATUS status;

    // 打开服务控制管理器
    scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
    if (scm == NULL)
    {
        printf("OpenSCManager failed, error=%d\n", GetLastError());
        return;
    }

    // 打开指定的服务
    service = OpenService(scm, serviceName, SERVICE_START | SERVICE_QUERY_STATUS);
    if (service == NULL)
    {
        printf("OpenService failed, error=%d\n", GetLastError());
        CloseServiceHandle(scm);
        return;
    }

    // 查询服务状态
    if (!QueryServiceStatus(service, &status))
    {
        printf("QueryServiceStatus failed, error=%d\n", GetLastError());
    }
    else
    {
        // 如果服务未在运行,则启动服务
        if (status.dwCurrentState != SERVICE_RUNNING)
        {
            if (!StartService(service, 0, NULL))
            {
                printf("StartService failed, error=%d\n", GetLastError());
            }
            else
            {
                printf("Service %s started successfully\n", serviceName);
            }
        }
        else
        {
            printf("Service %s is already running\n", serviceName);
        }
    }

    // 关闭服务句柄和服务控制管理器句柄
    CloseServiceHandle(service);
    CloseServiceHandle(scm);
}

int main()
{
    // 调用启动服务的函数
    StartService("MyService");

    return 0;
}

定义了一个停止服务的函数StopService和一个启动服务的函数StartService。这些函数接受服务名称作为参数,并使用Windows API中的函数来停止或启动相应的服务。

标签:scm,GCC,服务,SERVICE,service,Windows,Demo,printf,NULL
From: https://www.cnblogs.com/RioTian/p/18054235

相关文章

  • 在Windows操作系统上进行端口映射通常需要使用网络地址转换(NAT)规则或端口转发来实现。
    端口映射通常与目的网络地址转换(DNAT)概念相关联。在网络中,DNAT是一种技术,用于将传入的数据包的目的IP地址和/或端口号修改为内部网络中另一台计算机的IP地址和端口号。这样可以实现将外部流量导向内部特定计算机或服务的功能。因此,端口映射通常涉及DNAT技术,用于在网络中重......
  • Windows环境下Pytorch项目搭建在Docker中运行
    Windows环境下Pytorch项目搭建在Docker中运行1.安装windows版本的Docker​ 网上已有诸多博客教程,这里就不再赘述。2.搭建本地Pytorch环境​ 搭建本地Pytorch环境的方式我使用了两种方式,推荐使用第一种。​ 第一种:​ (1)在dockerhub中(https://hub.docker.com),找到自己版本......
  • Windows 操作系统中,Internet 协议版本 4 (TCP/IPv4) 的配置信息通常是保存在注册表中
    %SystemRoot%\system32\tcpipcfg.dll%SystemRoot%\system32\drivers\tcpip.sysSystem32\drivers\tcpip.sys%SystemRoot%\System32\wshtcpip.dll%SystemRoot%\System32\mswsock.dll%SystemRoot%\System32\perfnet.dll%SystemRoot%\System32\wsock32.dll......
  • 科幻:Windows内核攻击是指针对Windows操作系统内核的恶意攻击行为
    Windows内核攻击是指针对Windows操作系统内核的恶意攻击行为。Windows内核作为操作系统的核心组件,控制着系统资源的管理、进程调度、设备访问等关键功能,因此成为黑客和恶意分子攻击的一个重要目标。以下是一些常见的Windows内核攻击方式:内核漏洞利用:黑客通过利用Windows内核中......
  • tomcat8.5+ windows中html页面及控制台中文乱码问题解决办法
    tomcat8.5+windows中html页面及控制台中文乱码问题解决办法————————————————版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/onemy/article/details/106215384 https://blog.csdn.......
  • windows11下安装使用python多环境管理工具--poetry
    官网https://python-poetry.org/基础环境系统版本python版本poetry版本win1123H2多版本+3.6.8(默认)+3.8.6+3.10.41.8.2安装https://python-poetry.org/docs/我们选择脚本的方式安装使用powershell安装安装命令(Invoke-WebRequest-Urihttps://ins......
  • 重启windows构建服务器引起的一系列问题
    Jenkins构建部分命令找不到一、问题描述:jenkins构建报错ERROR,乱码二、分析原因进服务器手动执行,提示MSbuild.exe命令找不到,原来的环境变量设置的临时的,重启服务器之后,部分环境变量丢失 三、解决方法在Windows系统构建服务器安装工具后需要直接调用,请添加到系统变量中,避免......
  • windows下用Code::blocks gcc/mingw系使用wxWidgets库
    很多Windows下用Code::blocks+wxWidgets的朋友最开始的时候都会因为这个错误无法编译而放弃wx。下面给出详细解决方法:1.到WX的目录下,找到include\wx\platform.h文件,用Codeblocks打开它2.Codeblocks下用菜单栏的Search->Find功能,找到#include"wx/setup.h"一行3.将"wx/set......
  • 2024年,提升Windows开发和使用体验实践 - 终端&命令行篇
    前言经过前面的铺垫,终于继续更新了,这个大概率是本系列近期的最后一篇了。同时之前有些内容更新,我也补充到这一篇里面。关于scoop管理器的补充scoop常用命令scoophelp#查看帮助scoophelp<某个命令>#具体查看某个命令的帮助scoopinfo<app>#查看APP信......
  • Windows定时删除指定路径下N天前的文件以及文件夹
    Windows定时删除指定路径下N天前的文件以及文件夹 将下面代码复制到自建的.txt文件里,然后保存再更改后辍名为.bat,点击执行即可脚本文件存放随意,因为里面的路径是绝对路径1.删除指定路径下5天前的所有文件@echooffsetSrcDir=E:\WORK\GitsetDaysAgo=5forfiles/p......