Pagina 1 di 1

Condividi: Reimposta Windows Update

Pubblicato: 9 giugno 2022 - 14:10
di t.heroult
Ciao a tutti.
Voglio condividere con voi un piccolo pacchetto che ho sviluppato per risolvere alcuni problemi con WindowsUpdate.
In realtà, si tratta di una raccolta delle principali azioni note per risolvere i problemi di un WindowsUpdate non funzionante.

Azioni intraprese:
  • Svuotamento DNS
  • Purghe:
  • - File "qmgr*.dat" in ALLUSERSPROFILE/Dati applicazioni/Microsoft/Rete/Downloader
  • - File "qmgr*.dat" in ALLUSERSPROFILE/Microsoft/Network/Downloader
  • - Tutti i file in WINDIR/Logs/WindowsUpdate
  • Eliminazioni di cartelle (verranno ricostruite all'avvio del servizio Windows Update):
  • - WINDIR/SoftwareDistribution
  • - SYSTEM32/Catroot2
  • Eliminazione della chiave di registro:
  • - HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate
  • - HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\WindowsUpdate
  • GPUPDATE (a livello macchina)
  • Reimposta il servizio "bit"
  • Reimpostazione del servizio "Windows Update"
  • Nuova registrazione di alcune DLL
  • Ripristino di Winsock
  • Configurazione dell'avvio del servizio
  • Riavviare i servizi se necessario
  • Se Waptwua è attivo, disabilitare il servizio Windows Update
Ed ecco il codice:

Codice: Seleziona tutto

def install():
    print("Arrêt des services :")
    Stop_Service_if_needed('bits',"- Background Intelligent Transfer Service (bits).")
    Stop_Service_if_needed('wuauserv',"- Windows Update (wuauserv).")
    Stop_Service_if_needed('appidsvc',"- Application Identity (appidsvc).")
    Stop_Service_if_needed('cryptsvc',"- Cryptographic Services (cryptsvc).")

    print("Flush DNS")
    run("Ipconfig /flushdns")
    dossier = makepath(os.environ.get('ALLUSERSPROFILE'),'Application Data','Microsoft','Network','Downloader')
    if isdir(dossier):
        fichiers = find_all_files(dossier,include_patterns='qmgr*.dat')
        print('Purge des fichiers "qmgr*.dat" de ' + dossier)
        for fichier in fichiers:
            remove_file(fichier)
            print("Suppression de : " + fichier)

    dossier = makepath(os.environ.get('ALLUSERSPROFILE'),'Microsoft','Network','Downloader')
    if isdir(dossier):
        fichiers = find_all_files(dossier,include_patterns='qmgr*.dat')
        print('Purge des fichiers "qmgr*.dat" de ' + dossier)
        for fichier in fichiers:
            remove_file(fichier)
            print("Suppression de : " + fichier)

    dossier = makepath(os.environ.get('WINDIR'),'Logs','WindowsUpdate')
    if isdir(dossier):
        fichiers = find_all_files(dossier)
        print('Purge du dossier ' + dossier)
        for fichier in fichiers:
            remove_file(fichier)
            print("Suppression de : " + fichier)

    f_pending_xml = makepath(os.environ.get('WINDIR'),'winsxs','pending.xml')
    if isfile(f_pending_xml + '.bak'):
        remove_file(f_pending_xml + '.bak')
    if isfile(f_pending_xml):
        print("sauvegarde de " + f_pending_xml)
        os.rename(f_pending_xml,f_pending_xml + '.bak')

    dossier = makepath(os.environ.get('WINDIR'),'SoftwareDistribution')
    if isdir(dossier):
        print("Suppression de " + dossier)
        remove_tree(dossier)

    dossier = makepath(system32,'Catroot2')
    if isdir(dossier):
        print("Suppression de " + dossier)
        remove_tree(dossier)

    if reg_key_exists(HKEY_LOCAL_MACHINE,'SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate'):
        print('Purge de la clé de registe : HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate')
        registry_deletekey(HKEY_LOCAL_MACHINE,'SOFTWARE\Policies\Microsoft\Windows','WindowsUpdate')
    if reg_key_exists(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\WindowsUpdate'):
        print('Purge de la clé de registe : HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\WindowsUpdate')
        registry_deletekey(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies','WindowsUpdate')

    print("GPUPDATE (ordinateur)")
    run('gpupdate /force /target:computer')

    print('Reset du service "bits"')
    run('sc.exe sdset bits D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)')
    print('Reset du service "Windows Update"')
    run('sc.exe sdset wuauserv D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)')

    lst_dlls = ['atl.dll','urlmon.dll','mshtml.dll','shdocvw.dll','browseui.dll','jscript.dll','vbscript.dll','scrrun.dll','msxml.dll','msxml3.dll','msxml6.dll','actxprxy.dll','softpub.dll','wintrust.dll','dssenh.dll','rsaenh.dll','gpkcsp.dll','sccbase.dll','slbcsp.dll','cryptdlg.dll','oleaut32.dll','ole32.dll','shell32.dll','initpki.dll','wuapi.dll','wuaueng.dll','wuaueng1.dll','wucltui.dll','wups.dll','wups2.dll','wuweb.dll','qmgr.dll','qmgrprxy.dll','wucltux.dll','muweb.dll','wuwebv.dll','wudriver.dll']
    print("Ré-enregistrement de quelques dlls.")
    for f_dll in lst_dlls:
        fichier = makepath(system32,f_dll)
        run_notfatal('regsvr32.exe /s %s' % fichier)

    print("Réinitialisation du winsock.")
    run('netsh winsock reset')
    run('netsh winsock reset proxy')

    print("Configuration des services")
    run_notfatal('sc config wuauserv start= auto')
    run_notfatal('sc config bits start= auto ')
    run_notfatal('sc config DcomLaunch start= auto')


    print("Redémarrage des services selon leur propriété 'startup'")
    Start_Service_if_needed('bits',"- Background Intelligent Transfer Service (bits).")
    Start_Service_if_needed('wuauserv',"- Windows Update (wuauserv).")
    Start_Service_if_needed('appidsvc',"- Application Identity (appidsvc).")
    Start_Service_if_needed('cryptsvc',"- Cryptographic Services (cryptsvc).")

    # Si WAPTwua est actif sur la cible, alors désactivation et arrêt du service Windows Update
    if inifile_hassection(WAPT.config_filename,'waptwua'):
        waptwua_setting = inifile_readstring(WAPT.config_filename,'waptwua','enabled')
        if (waptwua_setting == 'True' or waptwua_setting == '1'):
            print("Waptwua est activé sur ce poste.")
            run_notfatal('sc config wuauserv start= disabled')
            Stop_Service_if_needed('wuauserv',"- Désactivation et arrêt du service Windows Update.")

    pass
    # put here what to do when package is installed on host
    # implicit context variables are WAPT, basedir, control, user, params, run

def Start_Service_if_needed(Service,DisplayInfo):
    if service_installed(Service):
        if not service_is_running(Service):
            key = reg_openkey_noredir(HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\%s' % (Service),KEY_READ)
            startup = reg_getvalue(key,'Start')
            if startup == '2':
                print(DisplayInfo)
                service_start(Service)

def Stop_Service_if_needed(Service,DisplayInfo):
    if service_installed(Service):
        if service_is_running(Service):
            print(DisplayInfo)
            service_stop(Service)
Sinceramente,
Tom

Re: Condivisione: Reimposta WindowsUpdate

Pubblicato: 9 giugno 2022 - 16:46
di erenodau
Ciao,

grazie per la condivisione, sembra molto interessante!

Buona giornata e a presto!