Le hook PySide6 de PyInstaller importe QtCore pour localiser les plugins Qt. Depuis Qt 6.10, Qt6Core.dll est lie a l'ICU de Windows (icuuc.dll, System32), que Wine n'implemente pas : l'import echouait, le hook ne collectait aucun plugin, et le binaire produit refusait de demarrer sous Windows avec « could not initialize Qt platform plugin "windows" ». - La build Wine epingle PySide6<6.10 (PYSIDE6_CONSTRAINT pour surcharger). - Verification avant compilation que PySide6 s'importe reellement. - Verification apres compilation que qwindows.dll est embarque. - Reinstallation des dependances declenchee par empreinte de requirements.txt et de la contrainte, au lieu de la seule presence de PyInstaller. Binaire verifie sous Wine : GUI (fenetre a trois onglets) et CLI OK, 45 Mo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
JoinDomainGUI
Outil de diagnostic réseau Active Directory et de jointure de domaine,
avec interface graphique (PySide6) et interface en ligne de commande.
Fonctionne sous Linux (realmd) et sous Windows (PowerShell Add-Computer),
le backend étant choisi automatiquement selon la plateforme.
Fonctionnalités
- Diagnostic réseau AD : résolution DNS du domaine, enregistrements SRV (LDAP / Kerberos), ping des contrôleurs de domaine, test des ports AD (53, 88, 389, 445, 464, 636, 3268), synchronisation NTP et présence des outils système requis.
- Jointure de domaine avec unité d'organisation et nom de machine optionnels, et détection du besoin de redémarrage.
- Installation des prérequis Linux manquants en un clic ou une commande
(
realmd,sssd,adcli,samba-common-bin,packagekitviaapt-get). - Interface graphique à trois onglets : Diagnostic réseau, Rejoindre le domaine, À propos.
- Interface en ligne de commande utilisable sans environnement graphique (SSH, déploiement scripté) : la CLI n'importe jamais PySide6.
- Le mot de passe ne transite jamais par la ligne de commande : il est
transmis au sous-processus via stdin ou son environnement, et n'apparaît
donc pas dans
psni dans l'historique du shell.
Installation
make install # crée l'environnement virtuel et installe les dépendances
Dépendances : Python 3.11+, PySide6, dnspython, ntplib.
Utilisation
Interface graphique
make run # depuis les sources
sudo ./dist/JoinDomainGUI # binaire autonome Linux
La jointure de domaine nécessite les droits root / administrateur ; le diagnostic, non.
Ligne de commande
# Diagnostic réseau
python main.py diagnose --domain exemple.lan
make diagnose DOMAIN=exemple.lan
# Jointure de domaine (root / administrateur requis)
echo 'motdepasse' | sudo python main.py join \
--domain exemple.lan --username administrateur --password-stdin
# Installation des prérequis système (Linux / apt uniquement)
sudo python main.py install-prereqs
Sans mot de passe fourni, il est demandé de façon interactive et masquée.
--password existe mais est déconseillé (visible dans ps et l'historique).
Code de sortie : 0 si tout va bien, 1 si un test échoue ou si la jointure
échoue, 2 en cas de droits insuffisants ou de backend indisponible.
Compilation des binaires
make build-linux # -> dist/JoinDomainGUI (ELF autonome)
make build-windows # -> dist/windows/JoinDomainGUI.exe (PE64 autonome)
make build # les deux
PyInstaller ne fait pas de cross-compilation. Le binaire Windows est donc
produit depuis Linux en exécutant un vrai PyInstaller Windows dans un
préfixe Wine dédié (packaging/build_windows_wine.sh) : le .exe obtenu
est un binaire Windows natif. Le premier appel télécharge un Python Windows
embarqué et les dépendances (plusieurs minutes) ; les suivants sont
incrémentaux.
Sur une machine Windows, packaging/build_windows.bat fait le même travail
nativement.
La build Wine épingle Qt 6.9 (PySide6<6.10) : à partir de Qt 6.10,
Qt6Core.dll dépend de l'ICU fourni par Windows (icuuc.dll dans System32),
que Wine n'implémente pas. PySide6 y devient inimportable — et le hook PySide6
de PyInstaller, qui importe QtCore pour localiser les plugins Qt, échoue alors
silencieusement et produit un .exe sans plugin de plateforme, qui refuse de
démarrer sous Windows (« could not initialize Qt platform plugin windows »). Le
script vérifie donc, avant compilation, que PySide6 s'importe, et après
compilation, que qwindows.dll est bien embarqué.
Publication
make publish # pousse la branche courante et les tags vers tous les dépôts
Le projet est publié sur deux instances Gitea :
git.tuxtech.fr (origin) et
git.h3campus.fr (h3campus).
Structure
main.py Point d'entrée : GUI sans argument, CLI sinon
domainjoin/
├── cli.py Interface en ligne de commande
├── gui.py Interface PySide6
├── diagnostics.py Moteur de diagnostic réseau
├── worker.py Exécution en arrière-plan pour la GUI
├── privileges.py Détection des droits root/administrateur
└── backend/
├── base.py Interface commune de jointure
├── linux_realmd.py Backend Linux (realmd / adcli)
└── windows_addcomputer.py Backend Windows (Add-Computer)
packaging/ Scripts de compilation PyInstaller
Voir CHANGELOG.md pour l'historique des versions.