Una vez terminado, si todo ha ido bien, lo veremos en la auditoría browser-msi-after-fix
Y normalmente una vez terminado logro hacer mis actualizaciones desde Wapt
Tengo algunas máquinas en las que no funcionó (tampoco funciona directamente en las máquinas, incluso con el MSI correcto de la versión correcta)
A continuación se muestra el código (puede que esté más optimizado, lo admito)
Código: Seleccionar todo
#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()
