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

相关推荐
赛丽曼12 分钟前
Python中的简单爬虫
爬虫·python
CODE_RabbitV19 分钟前
Python + 深度学习从 0 到 1(00 / 99)
开发语言·python·深度学习
微凉的衣柜1 小时前
在 PyTorch 中进行推理时,为什么 `model.eval()` 和 `torch.no_grad()` 需要同时使用?
人工智能·pytorch·python
int WINGsssss1 小时前
使用系统内NCCL环境重新编译Pytorch
人工智能·pytorch·python
孤单网愈云1 小时前
11.25Pytorch_手动构建模型实战
人工智能·pytorch·python
ZXF_H2 小时前
pip安装github上的开源软件包
git·python·github·pip
yivifu3 小时前
用python将一个扫描pdf文件改成二值图片组成的pdf文件
python·pdf·numpy·pillow·pymupdf
Eric.Lee20214 小时前
数据集-目标检测系列- 装甲车 检测数据集 armored_vehicles >> DataBall
python·算法·yolo·目标检测·装甲车检测
Eric.Lee20214 小时前
数据集-目标检测系列- 牵牛花 检测数据集 morning_glory >> DataBall
人工智能·python·yolo·目标检测·计算机视觉·牵牛花检测