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

提示:

1、理论上该Python脚本可以关闭和开启所有服务

2、搜索服务采用的是模糊搜索

3、常用服务查询: 暂时只写了 mysql、postgresql 无需要其他的自行添加即可


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

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

Windows服务管理脚本

python 复制代码
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: 退出? 返回主菜单 无效输入请重新输入 返回查询常见服务 返回主菜单

相关推荐
青 春 记 忆2 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器
GlueNa2SiO32 小时前
03-Flask模板引擎Jinja2详解
笔记·python·flask
临沂GEO4 小时前
GEO搜索优化科普|正规地理位置流量运营入门指南
大数据·人工智能·python·流量运营
大模型码小白4 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
荷蒲6 小时前
【小白量化Qbuddy】利用AI学习中文Python
人工智能·python·学习
数据狐(Datafox)7 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
量化吞吐机7 小时前
2026年下半年手工交易规则走向量化表达,产品该先接住哪一步
人工智能·python
Metaphor6928 小时前
使用 Python 读取和删除 Excel 文件属性
python·excel
迷迭香yy9 小时前
Python构建转融券多空识别系统从接口到因子的全流程 IG50免费开源股票数据API接口
开发语言·python·开源
雾沉川9 小时前
WinRAR 压缩解压软件 功能介绍、硬件适配、横向对比及安装使用教程
windows·winrar·压缩软件