feat: sortie de domaine, et corrections issues d'un echec reel de jointure

Sortie de domaine (demandee) :
- Bouton « Quitter le domaine » et commande CLI `leave`, via Remove-Computer
  sous Windows et realm leave sous Linux.
- Nettoyage optionnel des paquets sous Linux. packagekit est exclu de la
  liste : il sert aussi au gestionnaire de logiciels du bureau.
- Le champ « Nom de la machine » passe en lecture seule : il ne peut pas
  etre modifie depuis cette fenetre.

Corrections tirees de la sortie PowerShell rapportee :
- Les barres de progression etaient serialisees en CLIXML et polluaient le
  journal ; les accents arrivaient illisibles (console OEM lue en cp1252).
  Progression desactivee, console en UTF-8, CLIXML residuel filtre.
- Le marqueur interne JOIN_FAILURE: n'apparait plus dans le message affiche.

Diagnostic :
- Ajout du SRV `_ldap._tcp.dc._msdcs`, celui que DsGetDcName utilise pour
  localiser un DC. Son absence donne exactement l'erreur rencontree, et le
  diagnostic ne le verifiait pas.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-09 07:11:20 +02:00
co-authored by Claude Opus 5
parent 04a7b5dc64
commit eba4d0b843
9 changed files with 547 additions and 78 deletions
+20
View File
@@ -38,6 +38,26 @@ class DomainJoinBackend(ABC):
de ligne de commande : il est transmis via l'entrée standard du
sous-processus pour ne pas apparaître dans la liste des processus."""
def can_leave(self) -> bool:
"""True si ce backend sait faire quitter le domaine au poste."""
return False
def leave(
self,
domain: str,
username: str,
password: str,
remove_packages: bool = False,
on_output: Optional[OutputCallback] = None,
) -> JoinResult:
"""Fait quitter le domaine au poste. Comme pour join(), le mot de passe
ne passe jamais par la ligne de commande.
`remove_packages` demande en plus de désinstaller les paquets système
devenus inutiles — sans effet sur les backends qui n'en installent pas.
"""
return JoinResult(success=False, message="Sortie de domaine non prise en charge pour ce backend.")
def can_install_prerequisites(self) -> bool:
"""True si ce backend sait installer automatiquement les outils manquants."""
return False