場景
-
修改註冊表和禁用系統服務可以通過批處理,是否可以通過
Python
來處理? -
能否寫一個
Python
腳本來禁用WIN7
和WIN10
的自動更新?
說明
-
我在禁用自動更新批處理腳本裏用批處理實現了兩個功能:1.修改註冊表的自動更新;2.禁用
Windows Update
啓動。批處理能運行的前提是系統有sc
,net
,reg
這3個命令,沒有因系統的版本而被刪除. -
而使用
Python
寫的腳本調用WIN32
的函數來達到目的,這些API
都是系統必須自帶的,一定會存在,所以不用擔心以上命令不存在。 -
對系統服務操作部分使用了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
代碼
- 以下通過添加註冊表兩個禁用更新鍵值和關閉禁用
Windows Update
來達到禁用WIN10
和WIN7
自動更新的目的.
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