场景
- 在
Windows
里使用Python
做一些自动化管理时, 有时候需要创建,关闭,修改,禁用或删除Windows服务
, 而不是通过SC
命令来简单处理. 这时候我们就需要pywin32
库来调用WIN32
的函数来操作.
说明
- pywin32是第三方库,需要自己通过
pip install pywin32
安装,如果提示pip
版本过低,可以通过自己去pywin32下载的64位版本的AMD64
或32位版本的win32
,当然要对应Python
本身的版本.我这里例子用的
pywin32-227.win32-py3.7.exe
-
pywin32
还有很多模块,比如shell
,pythoncom
,win32file
,win32gui
,win32security
等,在安装pywin32
好后,会在开始-附件Python3
的快捷目录里生成一个Python for Windows Documentation
的chm文档,可以方便的看说明,不过缺点就是大概只说了和win32
的对应关系,函数的参数细节不多说,如果需要深入了解,需要自己通过bing
来搜索,函数名和Win32
的一样的,方便搜索. -
注意禁用系统服务要用管理员权限,所以要以管理员权限运行。另外
RestoreServiceStartManual
函数是用来还原Windows Update
服务设置的, 当年希望启用自动更新时.
代码
- 以下代码通过停止
Windows Update
服务,并禁用启动来达到禁用自动更新的目的.
import subprocess
import os
import win32service
import pywintypes
def AddServiceStartForbid(serviceName):
# SC_MANAGER_ALL_ACCESS
scHandle = None
serviceHandle = None
try:
scHandle = win32service.OpenSCManager(None,None,win32service.SC_MANAGER_ALL_ACCESS)
serviceHandle = win32service.OpenService(scHandle,serviceName,win32service.SERVICE_ALL_ACCESS )
serviceStatus = win32service.QueryServiceStatus(serviceHandle)
if (serviceStatus[1] != win32service.SERVICE_STOPPED):
serviceStatus = win32service.ControlService(serviceHandle,win32service.SERVICE_CONTROL_STOP)
print("serviceStatus: ",serviceStatus)
win32service.ChangeServiceConfig(serviceHandle,win32service.SERVICE_NO_CHANGE,
win32service.SERVICE_DISABLED,win32service.SERVICE_NO_CHANGE,None,None,0,None,None,None,None)
except pywintypes.error as err:
print("error: ",repr(err))
finally:
if serviceHandle != None:
win32service.CloseServiceHandle(serviceHandle)
if scHandle != None:
win32service.CloseServiceHandle(scHandle)
# subprocess.run(["net","stop",serviceName])
# subprocess.run(["sc","config",serviceName,"start=","disabled"])
pass
def RestoreServiceStartManual(serviceName):
scHandle = None
serviceHandle = None
try:
scHandle = win32service.OpenSCManager(None,None,win32service.SC_MANAGER_ALL_ACCESS)
serviceHandle = win32service.OpenService(scHandle,serviceName,win32service.SERVICE_ALL_ACCESS )
win32service.ChangeServiceConfig(serviceHandle,win32service.SERVICE_NO_CHANGE,
win32service.SERVICE_DEMAND_START,win32service.SERVICE_NO_CHANGE,None,None,0,None,None,None,None)
except pywintypes.error as err:
print("error: ",repr(err))
finally:
if serviceHandle != None:
win32service.CloseServiceHandle(serviceHandle)
if scHandle != None:
win32service.CloseServiceHandle(scHandle)
if __name__ == "__main__":
AddServiceStartForbid("wuauserv")
# RestoreServiceStartManual("wuauserv")
图1: