python管理Windows服务

上一篇介绍了pywin32模块,它的win32service子模块提供了对服务管理API的包装,相关API如下:

ChangeServiceConfig
ChangeServiceConfig2
CloseServiceHandle
ControlService
CreateDesktop
CreateService
CreateWindowStation
DeleteService
EnumDependentServices
EnumServicesStatus
EnumServicesStatusEx
EnumWindowStations
GetProcessWindowStation
GetServiceDisplayName
GetServiceKeyName
GetThreadDesktop
GetUserObjectInformation
LockServiceDatabase
OpenDesktop
OpenInputDesktop
OpenSCManager
OpenService
OpenWindowStation
QueryServiceConfig
QueryServiceConfig2
QueryServiceLockStatus
QueryServiceObjectSecurity
QueryServiceStatus
QueryServiceStatusEx
SetServiceObjectSecurity
SetServiceStatus
SetUserObjectInformation
StartService
UnlockServiceDatabase

有了这些API,完成一些服务的基本操作,比如安装服务、停止服务、启动服务等完全不在话下,只不过都是直接调用API而已。

不过pywin32还有一个对win32service模块的包装,叫做 win32serviceutil,使用它可以更方便地对服务进行控制。

InstallService(pythonClassString, serviceName, displayName, startType = None,
    errorControl = None, bRunInteractive = 0, serviceDeps = None, userName = None,
    password = None, exeName = None, perfMonIni = None,perfMonDll = None,
    exeArgs = None,description = None, delayedstart = None)  #安装服务

ChangeServiceConfig(pythonClassString, serviceName, startType = None,
    errorControl = None, bRunInteractive = 0, serviceDeps = None,
    userName = None, password = None,exeName = None, displayName = None,
    perfMonIni = None, perfMonDll = None,exeArgs = None,
    description = None, delayedstart = None)  #更改服务设置

#以上两个函数的第一个参数pythonClassString是为Python编写的Windows服务准备的,非Python服务则不需要,直接填None即可

RemoveService(serviceName)  #删除服务
ControlService(serviceName, code, machine = None)  #控制服务,code的具体定义参考MSDN的对ControlService的介绍
StopService(serviceName, machine = None) #停止服务
StartService(serviceName, args = None, machine = None) #启动服务
RestartService(serviceName, args = None, waitSeconds = 30, machine = None) #重启服务
QueryServiceStatus(serviceName, machine=None)  #查询服务状态

大部分API只需要提供服务名称就可以了,调用起来非常简单。

比如 win32serviceutil.StopService("Spooler") 就可以停止Spooler服务了。

对于 win32serviceutil.QueryServiceStatus()这个函数,它实际返回的是win32service.QueryServiceStatus的返回结果。

从MSDN和pywin32的帮助文件可知,win32service.QueryServiceStatus的返回值是一个元组,如下:

SERVICE_STATUS Object
A Win32 service status object is represented by a tuple:
Items
[0] int : serviceType
The type of service.
[1] int : serviceState
The current state of the service.
[2] int : controlsAccepted
The controls the service accepts.
[3] int : win32ExitCode
The win32 error code for the service.
[4] int : serviceSpecificErrorCode
The service specific error code.
[5] int : checkPoint
The checkpoint reported by the service.
[6] int : waitHint
The wait hint reported by the service

服务状态实际上是第1个元素(从0开始计数)

写个函数包装一下,并附带上控制功能:

import win32service
import win32serviceutil
import win32api

def GetSvcStatus(svcname):
    svcstatusdic = {
    #The service continue is pending.
    win32service.SERVICE_CONTINUE_PENDING:"continue pending",
    #The service pause is pending.
    win32service.SERVICE_PAUSE_PENDING:"pause pending",
    #The service is paused.
    win32service.SERVICE_PAUSED:"paused" ,
    #The service is running.
    win32service.SERVICE_RUNNING:"running",
    #The service is starting.
    win32service.SERVICE_START_PENDING:"start pending",
    # The service is stopping.
    win32service.SERVICE_STOP_PENDING:"stop pending" ,
    #The service is not running.
    win32service.SERVICE_STOPPED:"stoped"
    }
    status = win32serviceutil.QueryServiceStatus(svcname)
    if status:
        return svcstatusdic.get(status[1],"unknown")
    else:
        return "error"

svcname = "Spooler"
status = GetSvcStatus(svcname)
print("{} current status : {}".format(svcname,status))
if status == "running":
    win32serviceutil.StopService(svcname)
else:
    win32serviceutil.StartService(svcname)
win32api.Sleep(1000)
status = GetSvcStatus(svcname)
print("After Control,{} current status : {}".format(svcname,status))

输出结果如下:

掌握该模块的使用,对Windows平台的运维管理还是有相当帮助的。

原文地址:https://www.cnblogs.com/achillis/p/10462899.html

时间: 2024-10-26 05:13:44

python管理Windows服务的相关文章

利用Python脚本管理Windows服务

Windows服务常用的功能就是启动服务,关闭服务,重启服务和查询服务运行状态,其中查询服务运行状态是其他三种操作的基础. 本文中提到的使用Python脚本管理Windows服务实际上是调用win32serviceutil模块,此模块来自pywin32包,此模块本身有管理服务的功能,有兴趣的可以去阅读它的部分源码. 本脚本存在的目的是为了熟练Python的语法和基本操作,Windows下有更好的命令行工具来管理服务,如sc.Powershell等.通常命令行工具的执行速度要比services.m

用python写windows服务

用python写windows服务(1) 以python2.5 为例需要软件 * python 2.5        * pywin32(与2.5 版本相匹配的) Service Control Manager (SCM) 服务管理器(SCM) 是windows NT的 一部分,所有服务必须通过SCM 注册,SCM负责启动,停止服务等. 当一个进程通过SCM注册后, 有如下特质: * 运行该进程的用户,未必是当前登录的用户.        * 该进程如果依赖其他服务,哪么该服务启动前,依赖服务回

[转]玩转Windows服务系列——命令行管理Windows服务

本文转自:http://www.cnblogs.com/hbccdf/p/managewindowsservicewithcmd.html 说到Windows服务的管理就不得不说通过命令行的方式管理Windows服务,因为无论是系统管理员,还是通过编程的方式调用cmd命令,命令行都是非常方便以及强大的工具. 接下来就看一下如何通过cmd命令管理Windows服务. 管理Windows服务的主要cmd命令 管理Windows服务的命令应该有很多,但是我所了解到的命令主要有两个:sc.net. 说是

如何使用PowerShell管理Windows服务

[TechTarget中国原创] 作为一名系统管理员,最常见的任务之一就是学会管理Windows服务,这是保证Windows服务器和客户端正常运行的重要内容. 许多操作系统和应用程序都依赖于这些服务. Microsoft Management Console窗口是我们非常熟悉的一款Windows服务,通过该服务,管理员可以在本地或者远程计算机上操控服务.但是,一时间还不能改变几十台甚至几百台机器. 此时,PowerShell就派上用场了. PowerShell应用几个本地Cmdlet来管理Win

Java用wmi4j远程管理Windows服务

原文请访问:http://www.chenlichao.cn/opensource/74.html wmi4j是纯Java实现的Windows WMI客户端,它基于j-interop针对WMI重新封装,提供了更便捷的方法,能满足基本的windows管理,包括服务管理,性能查询,执行脚本等等. wmi4j下载 用Maven的朋友们可以直接引入,groupId=cn.chenlichao, artifactId=wmi4j, version=0.9. 源码地址: Github: https://gi

Python做windows服务

Python做windows服务(多进程服务),并结束多进程 Python中_,__,__xx__的区别 原文地址:https://www.cnblogs.com/sdadx/p/9241137.html

第十三篇 一个安装、管理windows服务的桌面程序

在网上看到一个修改程序入口的程序去把windows 服务修改成控制台的程序,然后利用控制台的程序把服务安装和管理,也想起自己原来也写了一个对windows 报务管理的程序,不过是winform的. 界面如下(自己使用,界面比较丑陋): 首先需要添加一个帮助类: 代码如下: class Windows { /// <summary> /// 检查服务存在的存在性 /// </summary> /// <param name=" NameService "&g

如何使用Topshelf管理Windows服务

一.官方网站及源码下载 1.官方网站:http://topshelf-project.com/ 2.源码下载:https://github.com/Topshelf/Topshelf/downloads 二.使用Topshelf创建服务 1 static void Main(string[] args) 2 { 3 HostFactory.Run(x => 4 { 5 x.Service<MyService>(dtService => 6 { 7 ServiceConfigurat

使用Topshelf管理Windows服务

一.官方网站及源码下载 1.官方网站:http://topshelf-project.com/ 2.源码下载:https://github.com/Topshelf/Topshelf/downloads 二.Topshelf优势 1.调试方便:不用创建windows服务项目,直接创建控制台程序即可,启动控制台就可以进行服务代码调试 2.安装/卸载服务方法           1.cmd-->cd 程序目录(直接定位到exe文件所在目录) 2.安装服务:JwifiRoute.Message.Log