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:
2026-09-04 17:04:34 +02:00
co-authored by Claude Sonnet 5
parent 73c102cc35
commit 21510d13f7
7 changed files with 48 additions and 14 deletions
+1 -1
View File
@@ -1,3 +1,3 @@
__version__ = "0.7.8"
__version__ = "0.7.9"
APP_NAME = "WGSecure"
APP_SHORT = "WGS"
+12 -4
View File
@@ -1927,15 +1927,23 @@ if (-not $currentSddl) {
}
$currentSddl = $currentSddl.Trim()
# Ajouter l'utilisateur actuel avec les permissions nécessaires, à
# l'intérieur de la clause D: existante (jamais en concaténant deux
# préfixes "D:" distincts, ce qui produit une SDDL invalide) :
# Insérer l'ACE de l'utilisateur actuel à l'intérieur de la clause D:
# existante, jamais en l'ajoutant après toute la chaîne : la SDDL d'un
# service porte souvent aussi une clause S: (SACL — étiquette d'intégrité
# obligatoire notamment, ex. "S:(ML;;NW;;;LW)"). Un simple "+" à la fin
# insérait alors l'ACE *après* le S:, produisant une SDDL syntaxiquement
# invalide (erreur 1804, ConvertStringSecurityDescriptorToSecurityDescriptor)
# — d'où l'échec systématique constaté malgré une lecture correcte de la
# SDDL actuelle.
# CC = Create Child (créer des services enfants)
# LC = List Child (lister les services enfants)
# SW = Self Write (modifier ses propres services)
# LO = List Object (lister)
# CR = Control (contrôle)
$fullSddl = $currentSddl + "(A;;CCLCSWLOCRRC;;;$currentUserSid)"
if ($currentSddl -notmatch '^(D:[A-Z]*)((?:\([^)]*\))*)(S:.*)?$') {
throw "Format de SDDL inattendu pour '$serviceName' : $currentSddl"
}
$fullSddl = $matches[1] + $matches[2] + "(A;;CCLCSWLOCRRC;;;$currentUserSid)" + $matches[3]
$setOutput = & sc.exe sdset $serviceName $fullSddl
if ($LASTEXITCODE -ne 0) {
+23 -5
View File
@@ -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 ""