当前位置: 首页 > article >正文

使用Python编写Windows系统服务管理脚本,主要用于管理mysql、postgresql等服务

提示:
1、理论上该Python脚本可以关闭和开启所有服务
2、搜索服务采用的是模糊搜索
3、常用服务查询: 暂时只写了 mysql、postgresql 如需要其他的自行添加即可


使用方式(使用管理员权限运行):

运行方式一:使用管理员权限运行cmd/powershell,进入文件所在目录,执行命令 python 文件.py 运行
运行方式二:使用管理员的方式运行PyCharm,然后通过PyCharm运行文件

Windows服务管理脚本

import win32service
import win32serviceutil


# 获取指定服务的状态
def get_service_status(service_name):
    try:
        # 打开服务控制管理器以枚举服务
        scm_handle = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ENUMERATE_SERVICE)
        # 打开指定的服务
        service_handle = win32service.OpenService(scm_handle, service_name, win32service.SERVICE_QUERY_STATUS)
        # 查询服务状态
        status = win32service.QueryServiceStatus(service_handle)[1]
        # 关闭服务句柄和服务控制管理器句柄
        win32service.CloseServiceHandle(service_handle)
        win32service.CloseServiceHandle(scm_handle)
        # 根据状态码返回相应的状态字符串
        if status == win32service.SERVICE_RUNNING:
            return '开启'
        elif status == win32service.SERVICE_STOPPED:
            return '关闭'
        else:
            return '未知状态'
    except Exception as e:
        print(f"获取服务状态失败: {e}")
        return None


# 根据查询字符串列出匹配的服务。
def list_services(query):
    services = []
    try:
        # 打开服务控制管理器以枚举服务
        scm_handle = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ENUMERATE_SERVICE)
        # 定义服务类型和状态过滤器
        type_filter = win32service.SERVICE_WIN32
        state_filter = win32service.SERVICE_STATE_ALL
        # 枚举所有服务
        status_enum = win32service.EnumServicesStatus(scm_handle, type_filter, state_filter)
        for service_tuple in status_enum:
            service_name = service_tuple[0]
            if query.lower() in service_name.lower():
                # 获取服务状态并添加到服务列表中
                status = get_service_status(service_name)
                services.append((service_name, status))
        # 关闭服务控制管理器句柄
        win32service.CloseServiceHandle(scm_handle)
    except Exception as e:
        print(f"查询服务失败: {e}")
    return services


# 显示服务列表,每行显示5个服务。
def display_services(services):
    for i, (name, status) in enumerate(services, start=1):
        print(f"{i}: {name}-{status}", end="\t")
        if i % 5 == 0:
            print()
    print()


# 管理服务:查询、选择和操作服务。
def manage_services():
    while True:
        print("-----------------------------------------管理服务------------------------------------------")
        query = input("请输入要查询的服务名: ")
        services = list_services(query)
        if not services:
            print("未找到相关服务,请重新输入。")
            continue

        # 将服务列表以每行5个的方式显示出来
        display_services(services)

        try:
            choice = int(input("\n请输入要操作的服务编号: "))
            if choice < 1 or choice > len(services):
                raise ValueError
            selected_service, current_status = services[choice - 1]
        except ValueError:
            print("无效输入请重新输入。")
            continue
        print("---------------------------------------管理服务-操作----------------------------------------")
        print("1:开启服务             2:关闭服务             3:无操作")
        action = input("\n请选择操作:")
        if action == '1':
            if current_status == '开启':
                print(f"{selected_service}服务已开启!")
            else:
                try:
                    print(f"{selected_service}服务开启中...")
                    win32serviceutil.StartService(selected_service)
                    print(f"{selected_service}服务已开启")
                except Exception as e:
                    print(f"启动服务失败: {e}")
            break
        elif action == '2':
            if current_status == '关闭':
                print(f"{selected_service}服务已关闭")
            else:
                try:
                    print(f"{selected_service}服务关闭中...")
                    win32serviceutil.StopService(selected_service)
                    print(f"{selected_service}服务已关闭")
                except Exception as e:
                    print(f"停止服务失败: {e}")
            break
        elif action == '3':
            break
        else:
            print("无效输入请重新输入。")


# 查询常见的服务
def common_services_query():
    while True:
        print("\n-----------------------------------查询常见的服务-结果--------------------------------------")
        common_queries = ["mysql", "postgresql"]
        all_services = []
        for query in common_queries:
            all_services.extend(list_services(query))

        if not all_services:
            print("未找到常用服务。")
            return

        display_services(all_services)

        # 提供继续操作或退出的选择
        choice = input("是否继续操作:(1:继续操作   2:退出)")

        if choice == '2':
            break  # 回到主菜单

        elif choice == '1':
            try:
                service_choice = int(input("请输入要操作的服务编号: "))
                if service_choice < 1 or service_choice > len(all_services):
                    raise ValueError
                selected_service, current_status = all_services[service_choice - 1]
            except ValueError:
                print("无效输入请重新输入。")
                continue
            print("\n-----------------------------------查询常见的服务-操作--------------------------------------")
            print("1: 开启服务             2: 关闭服务             3: 无操作")
            action = input("\n请选择操作:")

            if action == '1':
                if current_status == '开启':
                    print(f"{selected_service}服务已开启!")
                else:
                    try:
                        print(f"{selected_service}服务开启中...")
                        win32serviceutil.StartService(selected_service)
                        print(f"{selected_service}服务已开启")
                    except Exception as e:
                        print(f"启动服务失败: {e}")
                break
            elif action == '2':
                if current_status == '关闭':
                    print(f"{selected_service}服务已关闭")
                else:
                    try:
                        print(f"{selected_service}服务关闭中...")
                        win32serviceutil.StopService(selected_service)
                        print(f"{selected_service}服务已关闭")
                    except Exception as e:
                        print(f"停止服务失败: {e}")
                break
            elif action == '3':
                continue  # 回到查询常见服务菜单

            else:
                print("无效输入请重新输入。")
        else:
            print("无效输入请重新输入。")


# 显示主菜单并处理用户输入。
def main_menu():
    while True:
        print("------------------------------------------主菜单------------------------------------------")
        print("|                                                                                       |")
        print("|  (0)退出                           (1)管理服务                      (2)常用服务查询    |")
        print("|                                                                                       |")
        print("-----------------------------------------------------------------------------------------")
        choice = input("请输入: ")
        if choice == '0':
            print("退出脚本")
            break
        elif choice == '1':
            manage_services()
        elif choice == '2':
            common_services_query()
        else:
            print("无效输入请重新输入。")


if __name__ == "__main__":
    main_menu()

Windows服务管理脚本-流程图

输入0
输入1
输入2
无效输入
开始
主菜单
退出脚本
管理服务
常见服务查询
无效输入请重新输入
请输入要查询的服务名
查询服务
找到相关服务?
显示服务列表
未找到相关服务,请重新输入
请输入要操作的服务编号
有效输入?
选择服务
无效输入请重新输入
选择操作
选择1: 开启服务?
服务已开启?
服务已开启!
启动服务中...
启动成功?
服务已开启
启动服务失败
选择2: 关闭服务?
服务已关闭?
服务已关闭
停止服务中...
停止成功?
服务已关闭
停止服务失败
选择3: 无操作?
无操作
无效输入请重新输入
返回主菜单
返回主菜单
返回主菜单
返回主菜单
返回主菜单
返回主菜单
返回管理服务
返回管理服务
返回管理服务
查询常见的服务
找到常用服务?
显示服务列表
未找到常用服务
请输入 1:继续操作 2:退出
选择1: 继续操作?
请输入要操作的服务编号
有效输入?
选择服务
无效输入请重新输入
选择操作
选择1: 开启服务?
服务已开启?
服务已开启!
启动服务中...
启动成功?
服务已开启
启动服务失败
选择2: 关闭服务?
服务已关闭?
服务已关闭
停止服务中...
停止成功?
服务已关闭
停止服务失败
选择3: 无操作?
无操作
无效输入请重新输入
返回主菜单
返回主菜单
返回主菜单
返回主菜单
返回主菜单
返回主菜单
返回查询常见服务
返回查询常见服务
选择2: 退出?
返回主菜单
无效输入请重新输入
返回查询常见服务
返回主菜单

http://www.kler.cn/a/416918.html

相关文章:

  • 数据库原理-期末重要概念总结
  • Z2400046 基于JAVA+SSM+MYSQL的高校运动会管理系统的设计与实现 源码 配置 文档
  • AI实践项目——图片视频自动上色系统,让旧照片焕然一新
  • 龙迅#LT6912适用于HDMI2.0转HDMI+LVDS/MIPI,分辨率高达4K60HZ,支持音频和HDCP2.2
  • windows C#-语句
  • 19-鸿蒙开发中的线性布局-交叉轴对齐方式
  • R包开发时Imports和Suggests区分
  • 如何正确的检索一个研究领域的文献?以PubMed数据库为例
  • 基于Dell Idrac7的服务器硬件监控指标解读
  • 排序算法--堆排序【图文详解】
  • Day1 生信新手笔记
  • leetcode:222完全二叉树的节点个数
  • mysql的一次优化,同版本mysql服务器上的运行速度比本地慢很多
  • Github 2024-11-30 Rust开源项目日报 Top10
  • AWS账户注册未完成会收费吗?
  • 【JavaScript】同步异步详解
  • 阿里云服务器(centos7.6)部署前后端分离项目(MAC环境)
  • 七天掌握SQL——第六天:数据库性能优化与监控
  • java 接口防抖
  • SpringBoot 新冠密接者跟踪系统:校园疫情防控的智能守护者
  • 使用 pycharm 新建使用 conda 虚拟 python 环境的工程
  • 【JAVA】反射和注解
  • 设计模式----迭代器模式
  • 项目学习:仿b站的视频网站项目06 -视频分类01
  • 文档加密怎么做才安全?
  • flutter in_app_purchase google支付 PG-GEMF-01错误