[Python]_[中級]_[禁用WIN7和WIN10自動更新腳本]

場景

  1. 修改註冊表和禁用系統服務可以通過批處理,是否可以通過Python來處理?

  2. 能否寫一個Python腳本來禁用WIN7WIN10的自動更新?

說明

  1. 我在禁用自動更新批處理腳本裏用批處理實現了兩個功能:1.修改註冊表的自動更新;2.禁用Windows Update啓動。批處理能運行的前提是系統有sc,net,reg這3個命令,沒有因系統的版本而被刪除.

  2. 而使用Python寫的腳本調用WIN32的函數來達到目的,這些API都是系統必須自帶的,一定會存在,所以不用擔心以上命令不存在。

  3. 對系統服務操作部分使用了pywin32庫,這個庫是第三方庫,需要另外安裝pip install pywin32, 如果安裝不成功,可以單獨去下載release版本安裝包,注意對應的CPU版本amd64對應64位系統。,pywin32沒有提供對本地組策略進行操作,使用C++操作IGroupPolicyObject時並沒有成功執行. 由於時間費了太多不划算不解決編碼修改本地組策略的兩個值。有哪位同行有時間的可以實現這部分.

禁用 WIN7 和 WIN10 需要4個步驟.

# 方案一:
# 1、[Python實現]Windows+R,輸入“regedit”回車,打開註冊表編輯器,定位到  
# HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows在
# 「Windows」節點下新建一個名爲「WindowsUpdate」的項在「WindowsUpdate」項下新建一個名爲「AU」的項
# 在「HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU」下
# 新建一個名爲「AUOptions」的 32 位 DWORD 值,雙擊該值,將數值設置爲2.
#
# 2. [Python實現]鼠標右鍵“win”圖標在彈出的菜單欄中選擇“運行”選項,打開運行窗口後輸入“services.msc”,回車.
# 在打開的窗口中找到“windows Update”啓用選項.
# 在彈出的小窗口中的啓動類型選項處點擊選擇“禁用”,點擊“確定”
# https://www.zhihu.com/question/65332770

# 方案二:
# 1. [Python實現]按以下路徑依次展開HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer項。
#    在右側窗口新建DWORD值,將其數值名稱命名爲:NoWindowsUpdate,數值數據設置爲:1
# 2. [未實現]請您同時按下微軟徽標WIN鍵和R鍵,輸入gpedit.msc回車,打開:計算機配置->管理模板->Windows組件->Windosw Update(更新),在右側將配置自動更新和允許自動更新立即安裝的狀態改爲已禁用
# https://answers.microsoft.com/zh-hans/windows/forum/windows_10-update/%E5%A6%82%E4%BD%95%E5%85%B3%E9%97%ADwin10%E7%B3%BB/9b324287-0453-4af6-9bc0-0b221ef476f2

代碼

  1. 以下通過添加註冊表兩個禁用更新鍵值和關閉禁用Windows Update來達到禁用WIN10WIN7自動更新的目的.

forbid-autoupdate.py

import winreg
import subprocess
import os
import win32service
import pywintypes


def TestWinReg():
    explorer = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,"SOFTWARE\\Policies\\Microsoft\\Windows")

    try:
        i = 0
        while 1:
          name = winreg.EnumKey(explorer,i)
          print(repr(name))
          i += 1

    except WindowsError as err:
        print("OS error: {0}".format(err))

def AddForbidUpdateRegKeyValue(key,subKey,itemName,itemType,itemvalue):
    try:
        with winreg.CreateKey(key,subKey) as keyHandle:
            winreg.SetValueEx(keyHandle,itemName,0,itemType,itemvalue)
    except OSError as err:
        print("error: ",repr(err))
        pass

def RestoreUpdateAutoRegKeyValue(key,subKey,itemName):
    try:
        with winreg.OpenKey(key,subKey,0,winreg.KEY_SET_VALUE) as keyHandle:
            winreg.DeleteValue(keyHandle,itemName)
    except OSError as err:
        print("error: ",repr(err))
        pass

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__":

    AddForbidUpdateRegKeyValue(winreg.HKEY_LOCAL_MACHINE,
        "SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU",
        "AUOptions",winreg.REG_DWORD,2)

    AddForbidUpdateRegKeyValue(winreg.HKEY_LOCAL_MACHINE,
        "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",
        "NoWindowsUpdate",winreg.REG_DWORD,1)
    
    AddServiceStartForbid("wuauserv")

    # RestoreServiceStartManual("wuauserv")

    # RestoreUpdateAutoRegKeyValue(winreg.HKEY_LOCAL_MACHINE,
    #     "SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU","AUOptions")
    
    # RestoreUpdateAutoRegKeyValue(winreg.HKEY_LOCAL_MACHINE,
    #     "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer","NoWindowsUpdate")
    # value, type = winreg.QueryValueEx(explorer, "DesktopProcess")
    # print("user is", repr(value))

打包

可以用pyinstaller來打包爲一個EXE文件,當然pyinstaller也是第三方庫. 或者官方下載安裝包.

pip install pyinstaller

命令行執行以下命令,會生成forbid-autoupdate.exe文件

pyinstaller -F  forbid-autoupdate.py --uac-admin

下載

https://download.csdn.net/download/infoworld/12303448

參考

禁用自動更新批處理腳本

pywin32

win32service

修改服務啓動類型

changeserviceconfig

service_status

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

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

Python 3 Document winreg — Windows registry access

知乎-如何關閉win10的自動更新

微軟-如何關閉WIN10系統自動更新

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