chore(release): v0.7.9
Corrige la SDDL invalide (erreur 1804) produite par le fix précédent quand le service porte une clause S: (SACL/étiquette d'intégrité), et les accents corrompus dans les messages d'erreur Windows (mauvais codepage/encodage lors de la capture de sortie). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -102,12 +102,20 @@ def _no_window_kwargs() -> dict:
|
||||
def run_command(cmd: list[str], timeout: int = 10,
|
||||
env: dict | None = None) -> tuple[int, str, str]:
|
||||
try:
|
||||
text_kwargs = {"text": True}
|
||||
if is_windows():
|
||||
# Les outils console natifs (sc.exe, PowerShell non-Core, ping…)
|
||||
# écrivent dans le codepage OEM de la console (ex. CP850 en
|
||||
# français), pas en UTF-8 : sans préciser l'encodage, Python
|
||||
# décode avec le codepage ANSI par défaut et tout caractère
|
||||
# accentué remonte corrompu ("échoué" → "‚chou‚").
|
||||
text_kwargs = {"encoding": "oem", "errors": "replace"}
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=timeout,
|
||||
env=env,
|
||||
**text_kwargs,
|
||||
**_no_window_kwargs(),
|
||||
)
|
||||
return result.returncode, result.stdout.strip(), result.stderr.strip()
|
||||
@@ -215,10 +223,18 @@ def _run_elevated_windows(cmd: list[str], timeout: int = 60) -> tuple[int, str,
|
||||
]
|
||||
|
||||
out_path = os.path.join(tempfile.gettempdir(), f"wgsecure-elev-{uuid.uuid4().hex}.log")
|
||||
# `*>` fusionne tous les flux (succès, erreur, avertissement…) — cohérent
|
||||
# avec l'usage existant qui traite `err or out` indifféremment.
|
||||
# `*>&1 | Out-File -Encoding utf8` plutôt que la redirection `*>` brute :
|
||||
# cette dernière écrit en UTF-16LE (encodage par défaut de PowerShell
|
||||
# Windows pour `>`/`*>`), que la lecture Python en UTF-8 corromprait
|
||||
# (accents illisibles). `*>&1` fusionne tous les flux (succès, erreur,
|
||||
# avertissement…) dans le flux de sortie avant le pipe, comme le faisait
|
||||
# `*>` seul — cohérent avec l'usage existant qui traite `err or out`
|
||||
# indifféremment.
|
||||
call_expr = "& " + " ".join(_ps_quote(a) for a in cmd)
|
||||
wrapped_script = f"{call_expr} *> {_ps_quote(out_path)}; exit $LASTEXITCODE"
|
||||
wrapped_script = (
|
||||
f"{call_expr} *>&1 | Out-File -FilePath {_ps_quote(out_path)} -Encoding utf8; "
|
||||
f"exit $LASTEXITCODE"
|
||||
)
|
||||
elevated_cmd = ["powershell", "-NoProfile", "-NonInteractive", "-Command", wrapped_script]
|
||||
|
||||
info = SHELLEXECUTEINFOW()
|
||||
@@ -239,7 +255,9 @@ def _run_elevated_windows(cmd: list[str], timeout: int = 60) -> tuple[int, str,
|
||||
|
||||
def _read_output() -> str:
|
||||
try:
|
||||
with open(out_path, encoding="utf-8", errors="replace") as f:
|
||||
# utf-8-sig : Out-File -Encoding utf8 (Windows PowerShell)
|
||||
# ajoute un BOM ; -sig l'ignore silencieusement s'il est présent.
|
||||
with open(out_path, encoding="utf-8-sig", errors="replace") as f:
|
||||
return f.read().strip()
|
||||
except OSError:
|
||||
return ""
|
||||
|
||||
Reference in New Issue
Block a user