fix(windows): capture stdout/stderr élevé, tente wg show non élevé, étend la délégation
- _run_elevated_windows() capture désormais la sortie réelle d'une commande élevée (fichier temp écrit par le process élevé lui-même) : ShellExecuteEx runas ne transmet jamais les tubes hérités, donc tout message d'échec élevé (split-DNS NRPT, install/uninstall du tunnel) restait "erreur inconnue" jusqu'ici. - run_privileged_readonly() tente réellement `wg show` sous Windows non élevé au lieu d'abandonner sans essayer — le handshake ne se peuplait jamais. - Le bouton "Configurer les permissions" active aussi le mécanisme officiel WireGuard (LimitedOperatorUI + groupe Network Configuration Operators via son SID, le nom étant localisé) en plus de l'ACL du service déjà en place. - Le diagnostic Windows précise désormais que le split-DNS (NRPT) exige toujours une authentification admin séparée à la connexion/déconnexion, aucune ACL ne pouvant le déléguer (aucun mécanisme documenté trouvé). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+41
-4
@@ -1739,8 +1739,13 @@ class AdminWindow(QDialog):
|
||||
QApplication.processEvents()
|
||||
|
||||
if is_windows():
|
||||
split_dns_active = bool(
|
||||
(self._cfg.wg.get("split_dns_server") or "").strip()
|
||||
and (self._cfg.wg.get("split_dns_domains") or [])
|
||||
)
|
||||
lines, state = self._windows_privilege_lines(
|
||||
has_root_privileges(), wg_quick_available(), wireguard_exe())
|
||||
has_root_privileges(), wg_quick_available(), wireguard_exe(),
|
||||
split_dns_active)
|
||||
self._priv_result.setPlainText("\n".join(lines))
|
||||
self._priv_result.setStyleSheet(theme.result_view_style(state))
|
||||
return
|
||||
@@ -1768,7 +1773,8 @@ class AdminWindow(QDialog):
|
||||
|
||||
@staticmethod
|
||||
def _windows_privilege_lines(elevated: bool, wg_present: bool,
|
||||
wg_path: str) -> tuple[list[str], str]:
|
||||
wg_path: str,
|
||||
split_dns_active: bool = False) -> tuple[list[str], str]:
|
||||
"""Rapport d'élévation Windows. Séparé pour rester testable."""
|
||||
lines: list[str] = []
|
||||
if elevated:
|
||||
@@ -1788,6 +1794,20 @@ class AdminWindow(QDialog):
|
||||
"qu'administrateur ».")
|
||||
state = "warn"
|
||||
|
||||
if split_dns_active:
|
||||
lines.append("")
|
||||
lines.append("⚠️ Split-DNS configuré : les règles NRPT "
|
||||
"(Add/Remove-DnsClientNrptRule) exigent")
|
||||
lines.append(" toujours des droits administrateur — "
|
||||
"aucune ACL ne permet de l'éviter. Une")
|
||||
lines.append(" authentification admin séparée reste donc "
|
||||
"demandée à chaque connexion")
|
||||
lines.append(" et déconnexion tant que le split-DNS est "
|
||||
"actif, même une fois les")
|
||||
lines.append(" permissions ci-dessus accordées.")
|
||||
if state == "ok":
|
||||
state = "warn"
|
||||
|
||||
lines.append("")
|
||||
if wg_present:
|
||||
lines.append(f"✅ WireGuard installé — {wg_path}")
|
||||
@@ -1887,7 +1907,7 @@ class AdminWindow(QDialog):
|
||||
|
||||
# Commande PowerShell pour modifier les ACLs du service WireGuard
|
||||
# Ajoute à l'utilisateur actuel les droits de créer/supprimer des services WireGuardTunnel*
|
||||
ps_script = '''
|
||||
ps_script = r'''
|
||||
$serviceName = "WireGuard"
|
||||
$currentUserSid = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
|
||||
|
||||
@@ -1909,6 +1929,22 @@ sc sdset $serviceName $fullSddl
|
||||
# Redémarrer le service pour appliquer les changements
|
||||
Restart-Service -Name $serviceName -Force -ErrorAction SilentlyContinue
|
||||
|
||||
# Mécanisme officiel WireGuard (distinct de l'ACL ci-dessus, qui ne couvre
|
||||
# que le service) : autorise les membres du groupe "Network Configuration
|
||||
# Operators" à démarrer/arrêter leurs tunnels sans élévation.
|
||||
# https://github.com/WireGuard/wireguard-windows/blob/master/docs/adminregistry.md
|
||||
New-Item -Path 'HKLM:\Software\WireGuard' -Force | Out-Null
|
||||
Set-ItemProperty -Path 'HKLM:\Software\WireGuard' -Name 'LimitedOperatorUI' -Value 1 -Type DWord
|
||||
|
||||
# SID fixe S-1-5-32-556 = "Network Configuration Operators" : le nom du
|
||||
# groupe est localisé (FR : "Opérateurs de configuration réseau"), -SID est
|
||||
# indépendant de la langue du système.
|
||||
try {
|
||||
Add-LocalGroupMember -SID 'S-1-5-32-556' -Member $currentUserSid -ErrorAction Stop
|
||||
} catch {
|
||||
if ($_.Exception.Message -notmatch 'already a member') { throw }
|
||||
}
|
||||
|
||||
Write-Output "Permissions configurées pour l'utilisateur $currentUserSid"
|
||||
'''
|
||||
|
||||
@@ -1927,7 +1963,8 @@ Write-Output "Permissions configurées pour l'utilisateur $currentUserSid"
|
||||
self._priv_result.setPlainText(
|
||||
f"✅ Permissions configurées avec succès !\n\n"
|
||||
f"L'utilisateur actuel peut désormais gérer ses tunnels WireGuard "
|
||||
f"sans invite UAC (si le service WireGuard est démarré).\n\n"
|
||||
f"sans invite UAC (ACL du service + groupe « Opérateurs de "
|
||||
f"configuration réseau »).\n\n"
|
||||
f"Détails : {out.strip()}"
|
||||
)
|
||||
self._priv_result.setStyleSheet(theme.result_view_style("ok"))
|
||||
|
||||
Reference in New Issue
Block a user