[Python]_[初級]_[修改Windows服務-禁用WIN10的自動更新系統服務部分]

場景

  1. Windows裏使用Python做一些自動化管理時, 有時候需要創建,關閉,修改,禁用或刪除Windows服務, 而不是通過SC命令來簡單處理. 這時候我們就需要pywin32庫來調用WIN32的函數來操作.

說明

  1. pywin32是第三方庫,需要自己通過pip install pywin32安裝,如果提示pip版本過低,可以通過自己去pywin32下載的64位版本的AMD64或32位版本的win32,當然要對應Python本身的版本.我這裏例子用的
pywin32-227.win32-py3.7.exe
  1. pywin32還有很多模塊,比如shell,pythoncom,win32file,win32gui,win32security等,在安裝pywin32好後,會在開始-附件Python3的快捷目錄裏生成一個Python for Windows Documentation的chm文檔,可以方便的看說明,不過缺點就是大概只說了和win32的對應關係,函數的參數細節不多說,如果需要深入瞭解,需要自己通過bing來搜索,函數名和Win32的一樣的,方便搜索.

  2. 注意禁用系統服務要用管理員權限,所以要以管理員權限運行。另外RestoreServiceStartManual函數是用來還原Windows Update服務設置的, 當年希望啓用自動更新時.

代碼

  1. 以下代碼通過停止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:
在這裏插入圖片描述

參考

pywin32

win32service

修改服務啓動類型

changeserviceconfig

service_status

怎麼才能知道組策略中的設置對應於註冊表的位置

Win10家庭版系統也能使用組策略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章