Re: Errore del pacchetto di aggiornamento (1603)
Pubblicato: 20 agosto 2025 - 00:41
(seguente)
Una volta terminato, se tutto è andato bene, lo vedremo nell'audit browser-msi-after-fix
E di solito, una volta terminato, riesco a effettuare gli aggiornamenti da Wapt
Ho alcune macchine su cui non ha funzionato (e non funziona direttamente sulle macchine, nemmeno con l'MSI corretto della versione corretta)
Di seguito è riportato il codice (lo ammetto, potrebbe essere più ottimizzato)
)
Una volta terminato, se tutto è andato bene, lo vedremo nell'audit browser-msi-after-fix
E di solito, una volta terminato, riesco a effettuare gli aggiornamenti da Wapt
Ho alcune macchine su cui non ha funzionato (e non funziona direttamente sulle macchine, nemmeno con l'MSI corretto della versione corretta)
Di seguito è riportato il codice (lo ammetto, potrebbe essere più ottimizzato)
Codice: Seleziona tutto
#Auteur ddcorazon
# -*- coding: utf-8 -*-
from setuphelpers import *
import os, glob, shutil, traceback
# === CONFIG ===
tools = ["chrome", "edge"]
AUDIT_SCOPE_BEFORE = "browser-msi"
AUDIT_SCOPE_AFTER = "browser-msi-after-fix"
_UNINSTALL_KEYS = [
r'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
r'HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall',
r'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
r'HKCU\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall',
]
def install():
"""Copie le dossier 'msi' du paquet vers persistent_dir\\msi pour l'audit."""
src_dir = makepath(os.getcwd(), "msi") # côté build/exec, cwd = racine du paquet
dst_dir = makepath(persistent_dir, "msi")
if os.path.isdir(src_dir):
print("[INSTALL] Sync MSIs ->", dst_dir)
if os.path.isdir(dst_dir):
shutil.rmtree(dst_dir, ignore_errors=True)
shutil.copytree(src_dir, dst_dir)
else:
print("[INSTALL] Aucun dossier 'msi' à copier (", src_dir, ")")
def uninstall():
pass
# ----------------- Helpers -----------------
def _normalize_tools(t):
if isinstance(t, (list, tuple)):
lst = [str(x).strip() for x in t]
else:
lst = [s.strip() for s in str(t).split(",")]
return [s.lower() for s in lst if s]
def _scan_registry(term):
"""Retourne (DisplayName, LocalPackagePath, DisplayVersion)."""
for base in _UNINSTALL_KEYS:
try:
for sub in glob.glob(base + r'\*'):
try:
dn = registry_readstring(sub, 'DisplayName', '')
if not dn or term not in dn.lower():
continue
lp = registry_readstring(sub, 'LocalPackage', '')
dv = registry_readstring(sub, 'DisplayVersion', '')
return ((dn or '').strip(), (lp or '').strip(), (dv or '').strip())
except Exception:
continue
except Exception:
continue
return (None, None, None)
def _scan_wmi(term):
"""Fallback WMI (Win32_Product)."""
try:
ps = (
r"Get-WmiObject -Class Win32_Product | "
r"Where-Object { $_.Name -ne $null -and $_.Name -like '*" + term + r"*' } | "
r"Select-Object Name, LocalPackage, Version"
)
data = run_powershell(ps)
if not data:
return (None, None, None)
row = data[0] if isinstance(data, list) else data
name = (row.get('Name') or '').strip()
local = (row.get('LocalPackage') or '').strip()
ver = (row.get('Version') or '').strip()
return (name or None, local or None, ver or None)
except Exception:
return (None, None, None)
def _detect_one(term):
"""Retourne (name, pkg_basename, version, file_flag)."""
name, local, ver = _scan_registry(term)
if not name and not local and not ver:
name, local, ver = _scan_wmi(term)
pkg = os.path.basename(local) if local else ""
file_flag = "Unknown"
if pkg:
installer_dir = os.path.join(os.environ.get("SystemRoot", r"C:\Windows"), "Installer")
candidate1 = os.path.join(installer_dir, pkg)
candidate2 = local
if (candidate2 and os.path.exists(candidate2)) or os.path.exists(candidate1):
file_flag = "Found"
else:
file_flag = "Missing"
return name or "", pkg, ver or "", file_flag
def _run_audit(scope):
"""Exécute l’audit pour tous les tools, retourne (result_data, found_any)."""
result_data = {}
found_any = False
for term in _normalize_tools(tools):
section = term.capitalize()
name, pkg, ver, file_flag = _detect_one(term)
result_data[section] = {
"Name": name,
"Package": pkg,
"Version": ver,
"File": file_flag
}
if name or pkg or ver:
found_any = True
WAPT.write_audit_data_if_changed(scope, "audit_data", result_data)
WAPT.write_audit_data_if_changed(scope, "result", "OK" if found_any else "NotFound")
return result_data, found_any
def _fix_missing(result_data):
"""
Copie les MSI manquants depuis persistent_dir\\msi\\<tool>-<version>.msi
-> C:\\Windows\\Installer\\<package>
"""
installer_dir = os.path.join(os.environ.get("SystemRoot", r"C:\Windows"), "Installer")
src_dir = makepath(persistent_dir, "msi")
print(f"[INFO] Dossier source MSI: {src_dir}")
for app, info in result_data.items():
tool = app.lower()
pkg = info.get("Package") # ex: 16af95e8.msi
ver = info.get("Version") # ex: 139.0.x.x
flag = info.get("File")
if flag == "Missing" and pkg and ver:
src = makepath(src_dir, f"{tool}-{ver}.msi")
dst = makepath(installer_dir, pkg)
if os.path.exists(src):
print(f"[FIX] Copie {src} -> {dst}")
os.makedirs(installer_dir, exist_ok=True)
shutil.copyfile(src, dst)
else:
print(f"[WARN] MSI source introuvable pour {app}: {src}")
def _cleanup_persistent_msis():
"""Supprime persistent_dir\\msi pour ne rien laisser sur le poste."""
msi_dir = makepath(persistent_dir, "msi")
if os.path.isdir(msi_dir):
print(f"[CLEANUP] Suppression du répertoire: {msi_dir}")
shutil.rmtree(msi_dir, ignore_errors=True)
# ----------------- Audit principal -----------------
def audit():
try:
# 1) Audit avant
before_data, found_any = _run_audit(AUDIT_SCOPE_BEFORE)
# 2) Corrections si nécessaires
if found_any:
needs_fix = any(info.get("File") == "Missing" for info in before_data.values())
if needs_fix:
_fix_missing(before_data)
# 3) Audit après correction
_run_audit(AUDIT_SCOPE_AFTER)
return "OK"
else:
return "NotFound"
except Exception as e:
print("[ERROR] Exception durant l'audit :", e)
print(traceback.format_exc())
return "ERROR"
finally:
# 4) Toujours nettoyer le persistent_dir\msi en fin d’audit
_cleanup_persistent_msis()