場景
- 在
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: