DTLknowsWhy — Manuel de référence v2.1
Référence complète des modules et commandes de DTLknowsWhy 2.1 — moteur de diagnostic réseau et d'analyse causale Windows.
Préface
Ce manuel décrit l'interface en ligne de commande, l'interface graphique et la référence des modules internes de DTLknowsWhy 2.1. Il couvre chaque point d'entrée exécutable, chaque module collecteur, chaque module partagé, le moteur expert de règles, l'analyseur comparatif et le format des snapshots. Pour un guide opérationnel pas à pas, consultez le Guide utilisateur DTLknowsWhy.
DTLknowsWhy répond à une question pratique : « Pourquoi ça fonctionne sur une machine et pas sur une autre ? » Plutôt que de lister des symptômes, il identifie les causes probables et propose des actions correctives. La version 2.1 remplace l'ancienne analyse textuelle d'ipconfig /all par un moteur de collecte basé sur des objets PowerShell et CIM structurés, rendant l'outil entièrement indépendant de la langue et compatible avec toute locale Windows.
Audience visée
Ce manuel s'adresse aux administrateurs systèmes gérant des postes Windows 10 et 11 et des réseaux Windows, aux administrateurs réseau qui diagnostiquent des problèmes SMB, DNS et de connectivité, ainsi qu'aux développeurs qui étendent ou intègrent DTLknowsWhy. Une connaissance de l'invite de commandes Windows et des bases TCP/IP est supposée. Aucune expérience de développement Python n'est requise pour l'utilisation opérationnelle.
Conventions
| Convention | Signification |
|---|---|
monospace | Texte de commande, noms de fichiers, noms de fonctions, paramètres et littéraux de sortie |
| italique | Variables et paramètres fictifs — substituer la valeur réelle lors de la saisie |
| Gras | Nouveau terme introduit ou point critique mis en évidence |
[option] | Argument facultatif ; ne pas saisir les crochets |
{a|b} | Choix mutuellement exclusifs ; choisir exactement l'un ; ne pas saisir les accolades ni la barre verticale |
Documents associés
| Document | Description |
|---|---|
| Guide utilisateur DTLknowsWhy | Guide opérationnel pas à pas pour la première utilisation et l'usage quotidien |
| Manuel de référence NetDTL | Application web PHP/MySQL d'inventaire réseau agentless |
| Manuel de référence DTLsaysWhat | Outil d'inventaire système Windows inspiré de la commande SHOW SYSTEM d'OpenVMS |
| README.md | Résumé de démarrage rapide inclus à la racine du dépôt |
Chapitre 1 — Introduction
1.1 Vue d'ensemble
DTLknowsWhy est un outil de diagnostic et d'analyse experte pour Windows. Exécutez-le sur une machine pour obtenir immédiatement une image complète de sa configuration : version du système d'exploitation, profil réseau, paramètres IP, services Windows clés et connectivité de base. Pointez-le optionnellement vers une seconde machine pour récupérer son snapshot complet via l'agent intégré, puis comparez les deux configurations pour identifier la cause probable de la différence.
| Composant | Rôle |
|---|---|
agent.py | Point d'entrée principal ; répartiteur CLI et orchestrateur de snapshot |
DTLknowsWhy.exe | Exécutable GUI (sans fenêtre console) ; lance l'interface Tkinter |
DTLknowsWhy-CLI.exe | Exécutable CLI (avec fenêtre console) ; logique identique à agent.py à l'exécution |
DTLknowsWhy-Agent.exe | Agent distant ; expose un point d'accès HTTP de snapshot ; peut fonctionner comme service Windows |
expert.py | Moteur d'analyse expert ; charge un snapshot et émet des résultats de diagnostic |
compare.py | Analyseur comparatif ; charge deux snapshots et identifie les différences causales |
1.2 Nouveautés de la version 2.1
Collecte réseau indépendante de la langue
Les versions précédentes collectaient la configuration réseau en analysant la sortie texte d'ipconfig /all, ce qui dépendait des libellés Windows localisés et ne fonctionnait de manière fiable que sur Windows en français. La version 2.1 remplace entièrement ce moteur par des objets PowerShell et CIM structurés.
| Aspect | Version 2.0 | Version 2.1 |
|---|---|---|
| Source de données | Analyse texte d'ipconfig /all | Objets structurés PowerShell + CIM |
| Locale Windows | Français uniquement | Toute langue |
| Fragilité | Casse lors des changements de libellés par les mises à jour Windows | Robuste — les données structurées sont stables entre versions |
| Format du snapshot JSON | — | Inchangé (compatibilité descendante complète) |
Interface graphique avec sélection de langue
La version 2.1 ajoute une interface Tkinter (DTLknowsWhy.exe) avec un sélecteur de langue au démarrage. La langue choisie s'applique à tous les libellés d'interface, menus, rapports générés et messages de diagnostic. Le français et l'anglais sont pris en charge. La sélection de langue est indépendante de la langue d'affichage de Windows.
Nouvelles clés de collecte
Deux nouvelles clés sont ajoutées à la section system du snapshot : lm_compatibility_level (entier issu de la clé de registre LSA, ou null si absente) et bitlocker_status (dictionnaire lettre de lecteur → état de chiffrement). Ces clés alimentent de nouvelles règles dans le moteur expert.
Moteur expert et analyseur comparatif
La fonction analyze() accepte désormais un paramètre lang. L'analyseur comparatif (compare.py) est entièrement internationalisé via shared/i18n.py : tous les tags de résultat, descriptions de causes et chaînes de remédiation sont disponibles en français et en anglais via --lang.
1.3 Architecture
L'outil est structuré en quatre couches :
- Points d'entrée :
agent.py,expert.py,compare.pyet les exécutables compilés - Collecteurs :
agent/collectors/— un module par catégorie de données, retournant tous des dicts Python simples - Modules partagés :
shared/— sérialisation, génération de rapports texte et HTML, i18n, exécuteur de commandes, journal - Modules experts :
expert/— moteur de règles et analyseur comparatif
Système Windows
|
v
Collecteurs (system, network, tests, services, remote_tests)
|
v
Dict snapshot ──────────────────────────────┐
| |
v v
serializer.py rules_engine.py
report.py / html_report.py compare.py
| |
v v
Fichiers JSON + TXT + HTML Résultats de diagnostic (stdout)
1.4 Prérequis
| Composant | Version | Notes |
|---|---|---|
| Windows | 10 / 11 | Les collecteurs utilisent des commandes et classes CIM spécifiques à Windows |
| Python | 3.10+ | Bibliothèque standard uniquement — aucun pip install requis |
| PowerShell | 5.1 / 7+ | Préinstallé sur toutes les versions Windows supportées |
| Droits administrateur | Recommandés | Requis pour l'inspection complète des services, la configuration SMB et l'état BitLocker |
1.5 Installation
Aucun installeur n'est nécessaire. Copiez le dossier du projet sur la machine cible et exécutez depuis la racine du projet. La structure de répertoires est :
DTLknowsWhy/
├── agent.py ← point d'entrée principal
├── expert.py ← point d'entrée analyse expert
├── compare.py ← point d'entrée analyse comparative
├── DTLknowsWhy.exe ← exécutable GUI (console=False)
├── DTLknowsWhy-CLI.exe ← exécutable CLI (console=True)
├── DTLknowsWhy-Agent.exe ← exécutable agent distant
├── agent/
│ ├── gui.py
│ ├── server.py
│ ├── service.py
│ └── collectors/
│ ├── system.py
│ ├── network.py
│ ├── tests.py
│ ├── remote_tests.py
│ └── services.py
├── expert/
│ ├── rules_engine.py
│ └── compare.py
└── shared/
├── commands.py
├── serializer.py
├── report.py
├── report_writer.py
├── html_report.py
├── html_writer.py
├── i18n.py
├── version.py
└── logger.py
Chapitre 2 — Descriptions des commandes
Ce chapitre décrit chaque point d'entrée exécutable : syntaxe, paramètres, options, comportement et exemples. Pour les modules internes, voir le Chapitre 3.
agent.py
create_snapshot(), la fonction d'orchestration centrale.python agent.py [--snapshot] [--target IP_OU_HÔTE] [--listen] [--once] [--lang {fr,en}]
| Paramètre | Requis | Description |
|---|---|---|
| --snapshot | Facultatif | Collecte le snapshot local et écrit les fichiers de sortie. Peut être combiné avec --target. |
| --target HÔTE | Facultatif | Exécute les tests distants et récupère un snapshot complet depuis l'agent sur HÔTE. Implique --snapshot. |
| --listen | Facultatif | Démarre le serveur HTTP sur le port 5050. Mutuellement exclusif avec --snapshot et --target. |
| --once | Facultatif | Arrête le serveur après la première requête /snapshot réussie. Mode test uniquement ; ignoré en service Windows. |
| --lang {fr|en} | Facultatif | Langue des rapports. Défaut : fr. |
is_cli_executable() vérifie sys.argv[0] : si le nom de base est agent, contient cli, ou se termine par -agent, le processus s'exécute en mode CLI ; sinon il lance la GUI. Cela permet au même fichier source de se comporter correctement qu'il soit lancé comme python agent.py, DTLknowsWhy.exe ou DTLknowsWhy-CLI.exe.
# Snapshot local, rapport en français (défaut)
python agent.py --snapshot
# Snapshot local + requête agent distant
python agent.py --target PC-BEN-002 --lang fr
# Démarrer le serveur HTTP
python agent.py --listen
DTLknowsWhy.exe (GUI)
agent.py ; le flag PyInstaller console=False supprime la fenêtre console. Lance automatiquement l'interface Tkinter car is_cli_executable() retourne False pour ce nom.DTLknowsWhy.exe [--target IP_OU_HÔTE] [--lang {fr,en}]
Sans --target : ouvre la GUI à l'écran de sélection de situation. Avec --target : pré-remplit le champ cible. La langue est sélectionnable dans la liste déroulante de la GUI.
DTLknowsWhy-CLI.exe
agent.py ; le flag console=True conserve la fenêtre console. Se comporte en CLI car is_cli_executable() retourne True pour les noms contenant cli.DTLknowsWhy-CLI.exe [--snapshot] [--target IP_OU_HÔTE] [--listen] [--lang {fr,en}]
Mêmes paramètres et comportement que agent.py en mode CLI. Requiert des droits administrateur ; affiche un avertissement formaté et quitte si non élevé.
DTLknowsWhy-Agent
DTLknowsWhy-Agent.exe --listen
DTLknowsWhy-Agent.exe install
DTLknowsWhy-Agent.exe start
DTLknowsWhy-Agent.exe stop
DTLknowsWhy-Agent.exe remove
| Paramètre | Description |
|---|---|
| --listen | Démarre en mode interactif au premier plan ; écoute sur TCP 5050 jusqu'à Ctrl+C |
| install | Installe comme service Windows (requiert les droits administrateur) |
| start | Démarre le service Windows installé |
| stop | Arrête le service Windows en cours d'exécution |
| remove | Supprime l'enregistrement du service Windows |
GET /snapshot?key=DTLSECRET&lang=fr
| Paramètre | Requis | Description |
|---|---|---|
| key | Oui | Doit correspondre à API_KEY dans agent/server.py. Retourne HTTP 403 si absent ou incorrect. |
| lang | Non | fr (défaut) ou en |
server.py. Pas de TLS. Réseaux locaux de confiance uniquement. Le port TCP 5050 doit être ouvert en entrée dans le pare-feu Windows ; voir Annexe C. Au premier lancement, Windows SmartScreen peut bloquer l'agent ; voir Annexe D.# Mode interactif
DTLknowsWhy-Agent.exe --listen
# Installation et démarrage comme service Windows
DTLknowsWhy-Agent.exe install
DTLknowsWhy-Agent.exe start
expert.py
python expert.py [snapshot.json] [--lang {fr,en}]
| Paramètre | Requis | Description |
|---|---|---|
| snapshot.json | Facultatif | Chemin vers un fichier JSON de snapshot. Si omis, le fichier *_snapshot_*.json modifié le plus récemment dans le répertoire courant est utilisé. Quitte avec le code 1 si aucun fichier n'est trouvé. |
| --lang {fr|en} | Facultatif | Langue de sortie. Défaut : fr. |
| Niveau | Signification |
|---|---|
[OK] | Aucun problème détecté pour cette vérification |
[INFO] | Information ; aucune action requise |
[WARN] | Problème potentiel ; examiner la remédiation proposée |
[FAIL] | Problème confirmé ; appliquer la remédiation |
# Analyser le dernier snapshot, sortie en français
python expert.py --lang fr
# Analyser un snapshot spécifique
python expert.py PC-BEN-002_snapshot_20260607_093442.json --lang fr
compare.py
--lang.python compare.py snapshot_ref.json snapshot_cible.json [--lang {fr,en}]
| Paramètre | Requis | Description |
|---|---|---|
| snapshot_ref.json | Oui | Snapshot de référence (la machine qui fonctionne correctement — PC A) |
| snapshot_cible.json | Oui | Snapshot de la machine sous investigation — PC B |
| --lang {fr|en} | Facultatif | Langue de sortie. Défaut : fr. |
| --ben-reference | Facultatif | Utilise automatiquement le dernier PC-BEN-001_snapshot_*.json comme référence |
| Tag | Signification |
|---|---|
| [CAUSE CERTAINE] | La différence cause directement le problème |
| [CAUSE PROBABLE] | Une configuration connue pour bloquer la fonctionnalité en question |
| [CAUSE POSSIBLE] | Une différence susceptible de contribuer selon le scénario |
| [OBSERVÉ] | Constat factuel (ex. partages SMB accessibles listés) ; aucun problème impliqué |
| [À VÉRIFIER] | Configuration notable méritant une vérification manuelle |
| [INFORMATION MANQUANTE] | Champ absent du snapshot cible ; aucune conclusion possible |
python compare.py PREDATOR_snapshot_20260607.json PC-BEN-002_snapshot_20260607.json --lang fr
Chapitre 3 — Référence des modules
Ce chapitre décrit chaque module Python : objectif, fonctions publiques, paramètres et clés de sortie. Pour les points d'entrée CLI, voir le Chapitre 2.
Point d'entrée
create_snapshot(), la fonction d'orchestration centrale.create_snapshot(target=None, lang="fr", save_outputs=True) → dict
- Appelle tous les collecteurs en séquence : system, network, tests, services
- Si
targetest fourni : appellecollect_remote_tests(target)et tente de récupérer un snapshot complet depuis l'agent via HTTP - Exécute
analyze(snapshot, lang)et stocke les résultats danssnapshot["diagnosis"] - Exécute
compare_causal()oucompare_remote_target()et stocke les résultats danssnapshot["causal_comparison"] - Si
save_outputs=True: sérialise le JSON, génère et sauvegarde les rapports TXT et HTML - Retourne le dict snapshot complet
Interface graphique
create_snapshot() dans un thread d'arrière-plan pour maintenir la réactivité de l'interface.run_gui(create_snapshot, initial_target=None, auto_start=False, lang="fr")
Sept situations prédéfinies sont déclarées dans la constante liste SITUATIONS. Chaque situation possède un id, une clé i18n de titre, une clé i18n de description et un flag requires_target.
| id | Cible requise | Description |
|---|---|---|
| SMB-001 | Non | Machine invisible dans le voisinage réseau |
| SMB-002 | Oui | Accès SMB par IP fonctionne mais pas par nom |
| SMB-003 | Oui | Authentification SMB refusée (erreur 86 / 1326) |
| LOCAL-NETWORK | Non | Problème de connectivité réseau locale |
| LOCAL-SMB | Non | Service SMB local défaillant |
| REMOTE-WINDOWS | Oui | Accès à un partage Windows distant impossible |
| REMOTE-DEVICE | Oui | Diagnostiquer un équipement réseau distant |
QueueWriter redirige stdout / stderr vers une queue.Queue. Le thread principal interroge la queue toutes les 100 ms via root.after() et ajoute les messages au volet de progression. Cela évite les problèmes de sécurité des threads Tkinter.
Serveur HTTP
GET /snapshot. Appelle create_snapshot() localement et retourne le résultat en JSON. Utilisé à la fois par --listen et le service Windows.| Constante | Défaut | Description |
|---|---|---|
| API_KEY | DTLSECRET | Clé partagée ; les requêtes avec une mauvaise clé reçoivent HTTP 403 |
| HOST | 0.0.0.0 | Écoute sur toutes les interfaces réseau |
| PORT | 5050 | Port TCP |
Collecteurs
Collecteur système
| Clé | Source | Description |
|---|---|---|
| hostname | socket.gethostname() | Nom d'hôte NetBIOS / DNS |
| username | getpass.getuser() | Nom d'utilisateur Windows connecté |
| is_admin | ctypes.windll | Booléen — le processus a les droits administrateur |
| windows_product_name | Registre + normalisation | Nom du système d'exploitation corrigé pour l'anomalie de signalement Windows 10/11 |
| windows_version | Registre DisplayVersion | Chaîne de version de mise à jour fonctionnelle, ex. 23H2 |
| windows_build | Registre CurrentBuild | Numéro de build, ex. 22631 |
| lm_compatibility_level | Registre HKLM\...\Lsa\LmCompatibilityLevel | Entier 0–5, ou null si la clé est absente (défaut Windows) |
| bitlocker_status | PowerShell Get-BitLockerVolume / manage-bde | Dict lettre de lecteur → état de chiffrement, ou null si non collecté |
ProductName sur certaines versions. Le collecteur corrige cela en vérifiant si le numéro de build est ≥ 22000.null signifie que la clé de registre est absente et que Windows utilise son défaut compilé (NTLMv2 uniquement sur Windows 10/11 1903+). Voir Annexe E pour le tableau d'interprétation complet.Collecteur réseau
| Clé | Source | Description |
|---|---|---|
| active_adapter_profile | PowerShell Get-NetConnectionProfile | Nom du profil de connexion actif |
| network_category | PowerShell NetworkCategory | Type de profil : Public, Private ou Domain |
| ipv4 | CIM Win32_NetworkAdapterConfiguration | Adresse IPv4 principale |
| subnet_mask | CIM | Masque de sous-réseau |
| default_gateway | CIM | Adresse IP de la passerelle par défaut |
| dns_servers | CIM | Liste des adresses IP des serveurs DNS (dédupliquée) |
| dhcp_enabled | CIM | Booléen — DHCP actif sur l'adaptateur principal |
| netbios_option | CIM TcpipNetbiosOptions | Entier brut : 0=via DHCP, 1=activé, 2=désactivé |
| netbios_enabled | Dérivé de netbios_option | Booléen : True pour 0 ou 1, False pour 2, null si inconnu |
Collecteur de tests locaux
ping -n 1 avec un délai d'attente de 10 secondes et retourne True si le code de retour est 0.| Clé | Cible | Description |
|---|---|---|
| ping_localhost | 127.0.0.1 | Vérifie que la pile IP est fonctionnelle |
| ping_self | IPv4 locale | Vérifie que la carte réseau est joignable ; ignoré (False) si aucune IPv4 n'a été collectée |
| ping_gateway | Passerelle par défaut | Vérifie l'accessibilité du réseau local ; ignoré (False) si aucune passerelle n'a été collectée |
Collecteur de tests distants
| Clé | Description |
|---|---|
| target | L'IP ou le nom d'hôte passé à collect_remote_tests() |
| resolved_name | Nom d'hôte résolu depuis l'IP via ping -a -n 1 ; None si non résolu |
| ping_target | Booléen — le ping a réussi |
| tcp_80 / tcp_139 / tcp_443 / tcp_445 | Booléen — port TCP ouvert (PowerShell Test-NetConnection, délai de 15 s chacun) |
| mac_address | MAC depuis la table ARP ; None si non trouvée |
| target_type | Chaîne de classification ; voir Annexe B |
Collecteur de services
sc query. Retourne l'un de : Running, Stopped, Failed, Missing, Unknown.| Service | Rôle | Impact à l'arrêt |
|---|---|---|
| LanmanServer | Serveur SMB | Partage de fichiers et d'imprimantes indisponible |
| LanmanWorkstation | Client SMB (Workstation) | Impossible d'accéder aux partages distants |
| FDResPub | Publication de ressources de découverte (Function Discovery) | Machine invisible dans le voisinage réseau |
| fdPHost | Hôte fournisseur de découverte (Function Discovery) | Découverte d'équipements dégradée |
| lmhosts | Assistance NetBIOS TCP/IP | La résolution de noms NetBIOS peut échouer |
Modules partagés
Exécuteur de commandes
subprocess.run(). Essaie utf-8, cp850, cp1252 pour le décodage ; repli sur errors="replace". Retourne toujours un dict cohérent.run_command(command: str, timeout: int = 15) → dict
| Clé | Type | Valeur en cas d'erreur |
|---|---|---|
| stdout | str | Chaîne vide en cas de délai dépassé ou d'exception |
| stderr | str | Chaîne vide en cas de délai dépassé ou d'exception |
| exit_code | int | -1 en cas de délai dépassé ; -2 en cas d'exception |
Sérialiseur de snapshot
export_snapshot(data: dict, hostname: str) → Path
Écrit HÔTE_snapshot_AAAAMMJJ_HHMMSS.json avec indent=2, ensure_ascii=False. Retourne le Path du fichier créé.
Générateurs de rapports
(snapshot: dict, lang: str) et retournent une chaîne. Les libellés de section sont résolus via tr(clé, lang). Le rapport HTML est autonome avec un thème sombre intégré.generate_text_report(snapshot, lang="fr") → str
generate_html_report(snapshot, lang="fr") → str
- En-tête : titre, horodatage de génération
- Machine locale : identité, système, réseau, services Windows, tests locaux
- Diagnostic : résultats de
snapshot["diagnosis"] - Snapshot de l'agent distant (si
snapshot["remote_agent_snapshot"]est présent) - Comparaison causale (si
snapshot["causal_comparison"]est présent)
Internationalisation
tr(clé: str, lang: str = "fr") → str
Retourne la traduction de clé pour lang. Repli sur le français si la langue n'est pas trouvée. Retourne la clé elle-même si aucune traduction n'existe, rendant les clés manquantes immédiatement visibles dans l'interface.
- En-têtes de sections de rapport et libellés de champs
- Messages de progression CLI (
cli_*) - Libellés et messages de dialogue GUI (
gui_*) - Résultats du comparateur (
cmp_*) - Messages et remédiations des règles expert (
rule001_*àrule015_*) - Chaînes d'interprétation des collecteurs v2.1 (
netbios_option_*,lm_compat_*,bitlocker_*)
Version
DTLKNOWSWHY_VERSION = "2.1.0"
Journal
dtlknowswhy.log dans le répertoire courant au niveau INFO.from shared.logger import logger — le singleton est prêt à l'emploi. Les gestionnaires ne sont attachés qu'une seule fois (setup idempotent). Chaque appel à run_command() journalise la commande au niveau INFO ; les délais dépassés et les exceptions sont journalisés au niveau ERROR avec les traces complètes.
Modules experts
Moteur de règles
analyze() accepte un paramètre lang et tous les messages sont retournés dans la langue demandée via tr().analyze(snapshot: dict, lang: str = "fr") → list[dict]
Chaque dict de résultat : {"level": str, "message": str, "remediation": str|None, "case": str|None}
| Cas | Niveau | Condition |
|---|---|---|
| — | WARN | is_admin est False |
| — | FAIL / OK | Résultat du ping de la passerelle |
| — | WARN | Profil réseau est Public |
| — | FAIL | LanmanServer ou LanmanWorkstation arrêté |
| RÈGLE-001 | INFO | FDResPub actif mais machine potentiellement invisible (SMB-001) |
| RÈGLE-003 | WARN | Profil Privé + fdPHost actif mais FDResPub arrêté |
| RÈGLE-005-006-014 | INFO | TCP 445 ouvert sur cible probable_windows — guidance erreur d'auth |
| RÈGLE-007 | WARN / INFO | LmCompatibilityLevel présent et notable (0 ou ≥5) |
| RÈGLE-008-013 | FAIL | Ping OK mais TCP 445 fermé sur la cible |
| RÈGLE-009 | INFO | Ping OK, pas de TCP, pas de MAC — possible résolution IPv6 uniquement |
| RÈGLE-010 | INFO | TCP 445 ouvert mais pas de nom résolu — énumération lente par nom d'hôte |
| RÈGLE-011 | INFO | HTTP/HTTPS ouvert mais pas de SMB — TTL peut indiquer un équipement |
| RÈGLE-012 | WARN | BitLocker actif sur un ou plusieurs lecteurs |
| — | FAIL / INFO | Règles de type de cible distante (injoignable, mobile, équipement, etc.) |
Module d'analyse comparative
compare_causal() et compare_remote_target(). Compare deux dicts snapshot et retourne une liste de dicts de résultats avec niveau, titre, liste de preuves, cause et remédiation facultative. Toutes les chaînes sont résolues via tr(clé, lang).compare_causal(reference: dict, cible: dict, lang: str = "fr") → list[dict]
compare_remote_target(snapshot: dict, lang: str = "fr") → list[dict]
- Profil réseau (Public sur la cible)
- État des services LanmanServer et LanmanWorkstation
- État des services FDResPub et fdPHost
- Accessibilité de la passerelle
- Option NetBIOS
- Serveurs DNS
- Topologie IP (passerelle et masque de sous-réseau)
- Accessibilité TCP 445
- Présence de Bitdefender et pile de filtres fltmc
- Paramètres de configuration SMB client et serveur
- Partages SMB accessibles
- Contexte d'identité (local, domaine, AzureAD Joined)
Annexes
Annexe A — Format du snapshot
Le snapshot JSON produit par export_snapshot() a la structure de niveau supérieur suivante en v2.1 :
{
"metadata": {
"generated_at": "2026-06-07T09:34:42",
"generated_at_local": "07/06/2026 09:34:42",
"role": "local",
"target": "PC-BEN-002"
},
"system": {
"hostname": "PREDATOR",
"username": "didier",
"is_admin": true,
"windows_product_name": "Windows 11 Pro",
"windows_version": "23H2",
"windows_build": "22631",
"lm_compatibility_level": null,
"bitlocker_status": { "C:": "FullyEncrypted" }
},
"network": {
"active_adapter_profile": "Réseau",
"network_category": "Private",
"ipv4": "172.17.7.10",
"subnet_mask": "255.255.255.0",
"default_gateway": "172.17.7.1",
"dns_servers": ["172.17.7.1"],
"dhcp_enabled": false,
"netbios_option": 0,
"netbios_enabled": true
},
"tests": { "ping_localhost": true, "ping_self": true, "ping_gateway": true },
"services": { "LanmanServer": "Running", "LanmanWorkstation": "Running",
"FDResPub": "Running", "fdPHost": "Running", "lmhosts": "Running" },
"remote_tests": {
"target": "172.17.7.3", "resolved_name": "PC-BEN-002",
"ping_target": true, "tcp_80": false, "tcp_139": true,
"tcp_443": false, "tcp_445": true,
"mac_address": "B0:7B:25:7B:C7:58", "target_type": "probable_windows"
},
"diagnosis": [...],
"causal_comparison": [...],
"remote_agent_snapshot": { ... }
}
remote_tests est absent si aucun --target n'a été spécifié. remote_agent_snapshot est absent si l'agent était inaccessible. causal_comparison est toujours présent quand target est défini.
Annexe B — Classification de la cible
À la fin des tests distants, classify_target() dans remote_tests.py attribue une chaîne target_type. Les règles sont appliquées dans l'ordre ; la première correspondance l'emporte :
| target_type | Condition | Badge |
|---|---|---|
| probable_mobile_apple | Le nom d'hôte résolu contient iphone ou ipad | Bleu |
| probable_mobile_android | Le nom d'hôte résolu contient android | Bleu |
| probable_windows | TCP 445 ou TCP 139 ouvert | Vert |
| probable_device | TCP 80 ou TCP 443 ouvert | Orange |
| unknown_network_device | MAC résolue mais aucun port ouvert reconnaissable | Orange |
| unknown_host | Ping réussi mais pas de MAC et pas de port ouvert | Gris |
| unreachable | Ping échoué | Rouge |
probable_mobile_apple.Annexe C — Configuration du pare-feu
DTLknowsWhy-Agent écoute sur TCP 5050. Créer la règle entrante sur la machine cible depuis une invite de commandes élevée :
netsh advfirewall firewall add rule name="DTLknowsWhy Agent" ^
dir=in action=allow protocol=TCP localport=5050
Alternativement, via Pare-feu Windows Defender → Paramètres avancés → Règles de trafic entrant → Nouvelle règle → Port → TCP 5050 → Autoriser la connexion.
Annexe D — Avertissement SmartScreen
Au premier lancement, Windows Defender SmartScreen peut afficher :
Windows a protégé votre PC.
Microsoft Defender SmartScreen a empêché le démarrage d'une application non reconnue.
Ce comportement est attendu pour les exécutables non signés numériquement. Pour continuer : vérifier que le fichier provient du dépôt officiel DTLknowsWhy ; cliquer sur Informations complémentaires ; cliquer sur Exécuter quand même. En environnement d'entreprise, demander la signature numérique ou l'approbation explicite de l'équipe de sécurité avant tout déploiement étendu.
Annexe E — LmCompatibilityLevel
Cette valeur de registre contrôle le niveau de négociation d'authentification NTLM. Une clé absente (null dans le snapshot) signifie que Windows utilise son défaut compilé.
| Valeur | Client envoie | Serveur accepte | Résultat expert |
|---|---|---|---|
null (absent) | NTLMv2 uniquement (défaut W10/11) | NTLMv2 | INFO (aucun résultat) |
| 0 | LM et NTLM | LM, NTLM, NTLMv2 | WARN — risque de sécurité |
| 1 | LM+NTLM ; NTLMv2 si négocié | LM, NTLM, NTLMv2 | INFO |
| 2 | NTLM uniquement | LM, NTLM, NTLMv2 | INFO |
| 3 | NTLMv2 uniquement | LM, NTLM, NTLMv2 | INFO |
| 4 | NTLMv2 uniquement | NTLM, NTLMv2 (refus LM) | INFO |
| 5 | NTLMv2 uniquement | NTLMv2 uniquement (refus LM+NTLM) | WARN — peut bloquer SMB en Workgroup |
Pour définir la valeur depuis une invite PowerShell élevée :
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" `
-Name LmCompatibilityLevel -Value 3 -Type DWord
Annexe F — Limitations connues
- Windows uniquement. L'outil importe
ctypes.windllet appelle des commandes spécifiques à Windows. Il ne fonctionnera pas sous Linux ou macOS. - Adaptateur unique. Les collecteurs retournent les valeurs du premier adaptateur correspondant. Sur les machines multi-adaptateurs, les adaptateurs secondaires sont ignorés.
- La recherche MAC par ARP requiert l'adjacence Layer 2. La cible doit être sur le même segment réseau ou avoir été contactée récemment.
- Les tests distants peuvent être lents. Chaque sondage TCP a un délai de 15 s via PowerShell. Jusqu'à 60 s si les quatre ports expirent.
- Le mode serveur écrit des fichiers à chaque requête. Chaque
GET /snapshotdéclenche une collecte complète et écrit de nouveaux fichiers JSON, TXT et HTML sur la machine agent. - La collecte BitLocker requiert les droits administrateur. Sans droits admin,
bitlocker_statusseranull. - compare.py est directionnel. Seules les déviations du PC B par rapport au PC A sont signalées. Intervertir les arguments pour la comparaison inverse.
- Le chemin du logo du rapport HTML est relatif. Placer
netdtl_logo.pngdans le même répertoire que le rapport HTML. - Fichier journal dans le répertoire courant.
dtlknowswhy.logest écrit dans le répertoire d'exécution ; la journalisation échoue silencieusement sans permission d'écriture.
Annexe G — Historique des versions
| Version | Date | Modifications |
|---|---|---|
| 2.1.0 | 7 juin 2026 | Collecte réseau indépendante de la langue (PowerShell/CIM remplace l'analyse d'ipconfig /all) ; GUI Tkinter avec sélecteur de langue ; clés collecteurs lm_compatibility_level et bitlocker_status ; comparateur et moteur expert entièrement internationalisés ; 15 règles de base de connaissances issues de sessions opérationnelles ; plus de 280 clés i18n ; format JSON compatible avec les versions antérieures |
| 2.0.0 | 6 juin 2026 | Support agent distant ; mode service Windows ; point d'accès HTTP de snapshot ; comparaison causale locale/distante ; rapports HTML enrichis ; moteur de règles expert |
| 1.2.0 | — | Serveur de snapshot distant expérimental |
| 1.0.0 | — | Version initiale : diagnostics et rapports locaux |