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.

version2.1.0 date7 juin 2026 plateformeWindows 10 / 11 runtimePython 3.10+ languesfr / en auteurDidier DTL Morandi

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

ConventionSignification
monospaceTexte de commande, noms de fichiers, noms de fonctions, paramètres et littéraux de sortie
italiqueVariables et paramètres fictifs — substituer la valeur réelle lors de la saisie
GrasNouveau 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
Note sur les adresses : toutes les adresses IP et les noms d'hôtes utilisés dans les exemples sont fictifs.
Attention : les encadrés de ce type signalent des réglages ou des actions susceptibles de provoquer une perte de données, une exposition à des risques de sécurité ou un comportement inattendu s'ils ne sont pas suivis attentivement.
DocumentDescription
Guide utilisateur DTLknowsWhyGuide opérationnel pas à pas pour la première utilisation et l'usage quotidien
Manuel de référence NetDTLApplication web PHP/MySQL d'inventaire réseau agentless
Manuel de référence DTLsaysWhatOutil d'inventaire système Windows inspiré de la commande SHOW SYSTEM d'OpenVMS
README.mdRé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.

ComposantRôle
agent.pyPoint d'entrée principal ; répartiteur CLI et orchestrateur de snapshot
DTLknowsWhy.exeExécutable GUI (sans fenêtre console) ; lance l'interface Tkinter
DTLknowsWhy-CLI.exeExécutable CLI (avec fenêtre console) ; logique identique à agent.py à l'exécution
DTLknowsWhy-Agent.exeAgent distant ; expose un point d'accès HTTP de snapshot ; peut fonctionner comme service Windows
expert.pyMoteur d'analyse expert ; charge un snapshot et émet des résultats de diagnostic
compare.pyAnalyseur 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.

AspectVersion 2.0Version 2.1
Source de donnéesAnalyse texte d'ipconfig /allObjets structurés PowerShell + CIM
Locale WindowsFrançais uniquementToute langue
FragilitéCasse lors des changements de libellés par les mises à jour WindowsRobuste — les données structurées sont stables entre versions
Format du snapshot JSONInchangé (compatibilité descendante complète)
Compatibilité descendante : la structure du snapshot JSON est inchangée. Les règles expert, rapports HTML et modules d'analyse existants continuent de fonctionner sans modification.

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 :

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

ComposantVersionNotes
Windows10 / 11Les collecteurs utilisent des commandes et classes CIM spécifiques à Windows
Python3.10+Bibliothèque standard uniquement — aucun pip install requis
PowerShell5.1 / 7+Préinstallé sur toutes les versions Windows supportées
Droits administrateurRecommandésRequis 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

Point d'entrée principal. Analyse les arguments CLI, détermine le mode de fonctionnement (GUI ou CLI) et répartit en conséquence. Contient create_snapshot(), la fonction d'orchestration centrale.
Format
python agent.py [--snapshot] [--target IP_OU_HÔTE] [--listen] [--once] [--lang {fr,en}]
Paramètres
ParamètreRequisDescription
--snapshotFacultatifCollecte le snapshot local et écrit les fichiers de sortie. Peut être combiné avec --target.
--target HÔTEFacultatifExécute les tests distants et récupère un snapshot complet depuis l'agent sur HÔTE. Implique --snapshot.
--listenFacultatifDémarre le serveur HTTP sur le port 5050. Mutuellement exclusif avec --snapshot et --target.
--onceFacultatifArrête le serveur après la première requête /snapshot réussie. Mode test uniquement ; ignoré en service Windows.
--lang {fr|en}FacultatifLangue des rapports. Défaut : fr.
Logique de répartition

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.

Exemples
# 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)

Exécutable GUI compilé. Source identique à 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.
Format
DTLknowsWhy.exe [--target IP_OU_HÔTE] [--lang {fr,en}]
Comportement

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.

Note : la GUI requiert des droits administrateur pour des résultats complets. Si le processus n'est pas élevé, une boîte de dialogue demande à l'utilisateur s'il souhaite continuer sans droits administrateur.

DTLknowsWhy-CLI.exe

Exécutable CLI compilé. Source identique à 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.
Format
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

Exécutable agent distant. S'exécute sur la machine cible et expose un point d'accès HTTP unique sur le port TCP 5050. Peut fonctionner de manière interactive ou comme service Windows persistant.
Format
DTLknowsWhy-Agent.exe --listen
DTLknowsWhy-Agent.exe install
DTLknowsWhy-Agent.exe start
DTLknowsWhy-Agent.exe stop
DTLknowsWhy-Agent.exe remove
Paramètres
ParamètreDescription
--listenDémarre en mode interactif au premier plan ; écoute sur TCP 5050 jusqu'à Ctrl+C
installInstalle comme service Windows (requiert les droits administrateur)
startDémarre le service Windows installé
stopArrête le service Windows en cours d'exécution
removeSupprime l'enregistrement du service Windows
Point d'accès HTTP
GET /snapshot?key=DTLSECRET&lang=fr
ParamètreRequisDescription
keyOuiDoit correspondre à API_KEY dans agent/server.py. Retourne HTTP 403 si absent ou incorrect.
langNonfr (défaut) ou en
Sécurité : la clé API est stockée en clair dans 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.
Exemples
# Mode interactif
DTLknowsWhy-Agent.exe --listen

# Installation et démarrage comme service Windows
DTLknowsWhy-Agent.exe install
DTLknowsWhy-Agent.exe start

expert.py

Moteur d'analyse expert. Charge un fichier JSON de snapshot, le soumet au moteur de règles et affiche un rapport de résultats structuré sur stdout. Sélectionne automatiquement le snapshot le plus récent si aucun n'est spécifié.
Format
python expert.py [snapshot.json] [--lang {fr,en}]
Paramètres
ParamètreRequisDescription
snapshot.jsonFacultatifChemin 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}FacultatifLangue de sortie. Défaut : fr.
Niveaux de résultat
NiveauSignification
[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
Exemples
# 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

Analyseur comparatif. Compare deux snapshots (référence et cible) pour identifier les différences de configuration qui expliquent pourquoi une fonctionnalité fonctionne sur une machine et pas sur l'autre. Entièrement internationalisé via --lang.
Format
python compare.py snapshot_ref.json snapshot_cible.json [--lang {fr,en}]
Paramètres
ParamètreRequisDescription
snapshot_ref.jsonOuiSnapshot de référence (la machine qui fonctionne correctement — PC A)
snapshot_cible.jsonOuiSnapshot de la machine sous investigation — PC B
--lang {fr|en}FacultatifLangue de sortie. Défaut : fr.
--ben-referenceFacultatifUtilise automatiquement le dernier PC-BEN-001_snapshot_*.json comme référence
Tags de résultat (français)
TagSignification
[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
Analyse directionnelle : seules les déviations du PC B par rapport au PC A sont signalées. Pour effectuer la comparaison inverse, intervertir les arguments.
Exemple
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

agent.py
Analyse les arguments CLI, détermine le mode de fonctionnement et répartit en conséquence. Contient create_snapshot(), la fonction d'orchestration centrale.
Fonction clé

create_snapshot(target=None, lang="fr", save_outputs=True) → dict

Interface graphique

agent/gui.py
Interface graphique Tkinter. Présente un sélecteur de situation, un champ de saisie pour la cible, une liste déroulante de langue, un volet de progression et un volet de résultats. Exécute create_snapshot() dans un thread d'arrière-plan pour maintenir la réactivité de l'interface.
Point d'entrée

run_gui(create_snapshot, initial_target=None, auto_start=False, lang="fr")

Situations

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.

idCible requiseDescription
SMB-001NonMachine invisible dans le voisinage réseau
SMB-002OuiAccès SMB par IP fonctionne mais pas par nom
SMB-003OuiAuthentification SMB refusée (erreur 86 / 1326)
LOCAL-NETWORKNonProblème de connectivité réseau locale
LOCAL-SMBNonService SMB local défaillant
REMOTE-WINDOWSOuiAccès à un partage Windows distant impossible
REMOTE-DEVICEOuiDiagnostiquer un équipement réseau distant
Sortie via queue

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

agent/server.py
Serveur HTTP minimal exposant GET /snapshot. Appelle create_snapshot() localement et retourne le résultat en JSON. Utilisé à la fois par --listen et le service Windows.
Constantes de configuration
ConstanteDéfautDescription
API_KEYDTLSECRETClé partagée ; les requêtes avec une mauvaise clé reçoivent HTTP 403
HOST0.0.0.0Écoute sur toutes les interfaces réseau
PORT5050Port TCP
Sécurité : pas de TLS. Clé API en clair. Réseaux de confiance uniquement.

Collecteurs

Collecteur système

agent/collectors/system.py
Collecte l'identité de la machine, la version du système d'exploitation et les nouveaux champs v2.1 : LmCompatibilityLevel et état BitLocker.
Clés de sortie (v2.1)
CléSourceDescription
hostnamesocket.gethostname()Nom d'hôte NetBIOS / DNS
usernamegetpass.getuser()Nom d'utilisateur Windows connecté
is_adminctypes.windllBooléen — le processus a les droits administrateur
windows_product_nameRegistre + normalisationNom du système d'exploitation corrigé pour l'anomalie de signalement Windows 10/11
windows_versionRegistre DisplayVersionChaîne de version de mise à jour fonctionnelle, ex. 23H2
windows_buildRegistre CurrentBuildNuméro de build, ex. 22631
lm_compatibility_levelRegistre HKLM\...\Lsa\LmCompatibilityLevelEntier 0–5, ou null si la clé est absente (défaut Windows)
bitlocker_statusPowerShell Get-BitLockerVolume / manage-bdeDict lettre de lecteur → état de chiffrement, ou null si non collecté
Normalisation Windows 11 : Windows 11 se signale comme « Windows 10 » dans le registre ProductName sur certaines versions. Le collecteur corrige cela en vérifiant si le numéro de build est ≥ 22000.
LmCompatibilityLevel : une valeur 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

agent/collectors/network.py
Collecte la configuration IP et les informations de profil depuis des objets PowerShell et CIM structurés. Indépendant de la langue en v2.1 ; fonctionne sur toute locale Windows.
Clés de sortie
CléSourceDescription
active_adapter_profilePowerShell Get-NetConnectionProfileNom du profil de connexion actif
network_categoryPowerShell NetworkCategoryType de profil : Public, Private ou Domain
ipv4CIM Win32_NetworkAdapterConfigurationAdresse IPv4 principale
subnet_maskCIMMasque de sous-réseau
default_gatewayCIMAdresse IP de la passerelle par défaut
dns_serversCIMListe des adresses IP des serveurs DNS (dédupliquée)
dhcp_enabledCIMBooléen — DHCP actif sur l'adaptateur principal
netbios_optionCIM TcpipNetbiosOptionsEntier brut : 0=via DHCP, 1=activé, 2=désactivé
netbios_enabledDérivé de netbios_optionBooléen : True pour 0 ou 1, False pour 2, null si inconnu

Collecteur de tests locaux

agent/collectors/tests.py
Exécute trois tests ping pour vérifier la santé de la pile IP locale. Chaque test utilise ping -n 1 avec un délai d'attente de 10 secondes et retourne True si le code de retour est 0.
Clés de sortie
CléCibleDescription
ping_localhost127.0.0.1Vérifie que la pile IP est fonctionnelle
ping_selfIPv4 localeVérifie que la carte réseau est joignable ; ignoré (False) si aucune IPv4 n'a été collectée
ping_gatewayPasserelle par défautVérifie l'accessibilité du réseau local ; ignoré (False) si aucune passerelle n'a été collectée

Collecteur de tests distants

agent/collectors/remote_tests.py
Exécute une batterie de tests de diagnostic distants contre une IP ou un nom d'hôte cible : ping, résolution du nom d'hôte, sondages TCP sur les ports 80/139/443/445, recherche d'adresse MAC et classification automatique de la cible. Les sondages TCP et la recherche MAC ne sont tentés que si le ping réussit.
Clés de sortie
CléDescription
targetL'IP ou le nom d'hôte passé à collect_remote_tests()
resolved_nameNom d'hôte résolu depuis l'IP via ping -a -n 1 ; None si non résolu
ping_targetBooléen — le ping a réussi
tcp_80 / tcp_139 / tcp_443 / tcp_445Booléen — port TCP ouvert (PowerShell Test-NetConnection, délai de 15 s chacun)
mac_addressMAC depuis la table ARP ; None si non trouvée
target_typeChaîne de classification ; voir Annexe B

Collecteur de services

agent/collectors/services.py
Interroge cinq services Windows critiques pour le partage de fichiers réseau et la résolution de noms via sc query. Retourne l'un de : Running, Stopped, Failed, Missing, Unknown.
Services surveillés
ServiceRôleImpact à l'arrêt
LanmanServerServeur SMBPartage de fichiers et d'imprimantes indisponible
LanmanWorkstationClient SMB (Workstation)Impossible d'accéder aux partages distants
FDResPubPublication de ressources de découverte (Function Discovery)Machine invisible dans le voisinage réseau
fdPHostHôte fournisseur de découverte (Function Discovery)Découverte d'équipements dégradée
lmhostsAssistance NetBIOS TCP/IPLa résolution de noms NetBIOS peut échouer

Modules partagés

Exécuteur de commandes

shared/commands.py
Enveloppe légère autour de subprocess.run(). Essaie utf-8, cp850, cp1252 pour le décodage ; repli sur errors="replace". Retourne toujours un dict cohérent.
Fonction

run_command(command: str, timeout: int = 15) → dict

CléTypeValeur en cas d'erreur
stdoutstrChaîne vide en cas de délai dépassé ou d'exception
stderrstrChaîne vide en cas de délai dépassé ou d'exception
exit_codeint-1 en cas de délai dépassé ; -2 en cas d'exception

Sérialiseur de snapshot

shared/serializer.py
Écrit le dict snapshot dans un fichier JSON horodaté.
Fonction

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

shared/report.py  /  shared/html_report.py
Génèrent respectivement les rapports en texte brut et en HTML. Acceptent tous deux (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é.
Fonctions

generate_text_report(snapshot, lang="fr") → str

generate_html_report(snapshot, lang="fr") → str

Sections du rapport

Internationalisation

shared/i18n.py
Référentiel central de toutes les chaînes visibles par l'utilisateur en français et en anglais. La version 2.1 ajoute plus de 280 clés couvrant les libellés GUI, les champs collecteurs v2.1, les résultats du comparateur et les règles expert issues des sessions de diagnostic opérationnel.
Fonction

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.

Catégories de clés

Version

shared/version.py
Source unique de vérité pour la chaîne de version affichée dans la bannière GUI et les en-têtes de rapport.
Constante

DTLKNOWSWHY_VERSION = "2.1.0"

Journal

shared/logger.py
Journal Python à l'échelle de l'application. Écrit dans dtlknowswhy.log dans le répertoire courant au niveau INFO.
Utilisation

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

expert/rules_engine.py
Logique de diagnostic centrale. Applique une séquence de règles à un dict snapshot et retourne une liste de dicts de résultats. En v2.1, analyze() accepte un paramètre lang et tous les messages sont retournés dans la langue demandée via tr().
Fonction

analyze(snapshot: dict, lang: str = "fr") → list[dict]

Chaque dict de résultat : {"level": str, "message": str, "remediation": str|None, "case": str|None}

Règles appliquées (résumé)
CasNiveauCondition
WARNis_admin est False
FAIL / OKRésultat du ping de la passerelle
WARNProfil réseau est Public
FAILLanmanServer ou LanmanWorkstation arrêté
RÈGLE-001INFOFDResPub actif mais machine potentiellement invisible (SMB-001)
RÈGLE-003WARNProfil Privé + fdPHost actif mais FDResPub arrêté
RÈGLE-005-006-014INFOTCP 445 ouvert sur cible probable_windows — guidance erreur d'auth
RÈGLE-007WARN / INFOLmCompatibilityLevel présent et notable (0 ou ≥5)
RÈGLE-008-013FAILPing OK mais TCP 445 fermé sur la cible
RÈGLE-009INFOPing OK, pas de TCP, pas de MAC — possible résolution IPv6 uniquement
RÈGLE-010INFOTCP 445 ouvert mais pas de nom résolu — énumération lente par nom d'hôte
RÈGLE-011INFOHTTP/HTTPS ouvert mais pas de SMB — TTL peut indiquer un équipement
RÈGLE-012WARNBitLocker actif sur un ou plusieurs lecteurs
FAIL / INFORègles de type de cible distante (injoignable, mobile, équipement, etc.)
Règles RÈGLE-002, 004, 015 sont documentées dans la base de connaissances mais non implémentées comme règles actives : leurs conditions (énumération des règles pare-feu, résultat gpresult, config GLPI) ne sont pas collectées dans le schéma de snapshot actuel.

Module d'analyse comparative

expert/compare.py
Contient 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).
Fonctions

compare_causal(reference: dict, cible: dict, lang: str = "fr") → list[dict]

compare_remote_target(snapshot: dict, lang: str = "fr") → list[dict]

Zones de comparaison

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_typeConditionBadge
probable_mobile_appleLe nom d'hôte résolu contient iphone ou ipadBleu
probable_mobile_androidLe nom d'hôte résolu contient androidBleu
probable_windowsTCP 445 ou TCP 139 ouvertVert
probable_deviceTCP 80 ou TCP 443 ouvertOrange
unknown_network_deviceMAC résolue mais aucun port ouvert reconnaissableOrange
unknown_hostPing réussi mais pas de MAC et pas de port ouvertGris
unreachablePing échouéRouge
Priorité : la classification basée sur le nom d'hôte (Apple, Android) prend la priorité sur la classification basée sur les ports. Un équipement avec TCP 445 ouvert dont le nom d'hôte contient iphone est classé 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é.

ValeurClient envoieServeur accepteRésultat expert
null (absent)NTLMv2 uniquement (défaut W10/11)NTLMv2INFO (aucun résultat)
0LM et NTLMLM, NTLM, NTLMv2WARN — risque de sécurité
1LM+NTLM ; NTLMv2 si négociéLM, NTLM, NTLMv2INFO
2NTLM uniquementLM, NTLM, NTLMv2INFO
3NTLMv2 uniquementLM, NTLM, NTLMv2INFO
4NTLMv2 uniquementNTLM, NTLMv2 (refus LM)INFO
5NTLMv2 uniquementNTLMv2 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

Annexe G — Historique des versions

VersionDateModifications
2.1.07 juin 2026Collecte 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.06 juin 2026Support 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.0Serveur de snapshot distant expérimental
1.0.0Version initiale : diagnostics et rapports locaux