À propos de cette documentation
Ceci est le site officiel de documentation pour DNSServer.DebugLogParser, un module PowerShell qui transforme les fichiers de journal de débogage du serveur DNS Windows en données CSV structurées et analysables.
À propos du module
DNSServer.DebugLogParser est né d’un besoin réel : les journaux de débogage du serveur DNS Windows sont des textes lisibles par l’humain, mais pas adaptés à l’analyse ou au reporting. Ce module comble cette lacune en convertissant les fichiers journaux bruts en format CSV structuré, compatible avec des outils courants comme Excel, Power BI, bases de données SQL et systèmes SIEM.
Principes clés de conception :
- Performance avant tout — optimisé pour des fichiers de plus de 100 Mo grâce à l’I/O en streaming et aux opérations sur chaînes
- Compatibilité multi-édition — supporte PowerShell Desktop (5.1+) et Core (7.x)
- Prêt pour la production — inclut validation des en-têtes, gestion des erreurs et compression optionnelle
- Compatible pipeline — s’intègre naturellement à l’architecture pipeline de PowerShell
Ce que vous trouverez ici
Nouveau dans le module ? Commencez par la Présentation générale.
Ressources
Contribution
Les contributions sont les bienvenues. Si vous trouvez des problèmes, des erreurs ou avez des suggestions d’amélioration, veuillez ouvrir un ticket ou une pull request sur le dépôt GitHub.
1 - Vue d'ensemble
Ce que fait DNSServer.DebugLogParser, à quoi ressemble un journal de débogage DNS Windows, et quand il vaut la peine de le convertir en CSV.
Le serveur DNS Windows peut écrire un journal de débogage. C’est un fichier texte brut, destiné à être lu par un humain, et qui peut grossir de plusieurs centaines de mégaoctets par jour sur un contrôleur de domaine très sollicité. Cette combinaison le rend presque inutilisable dès que vous voulez répondre à une question comme « quel client a demandé ce domaine 40 000 fois la nuit dernière ? »
DNSServer.DebugLogParser transforme ce fichier texte en tableau CSV. Une ligne de journal devient une ligne avec des colonnes nommées, que vous pouvez ouvrir dans Excel, charger dans Power BI, insérer en masse dans SQL Server, ou envoyer à votre SIEM.
Le module contient une seule commande :
Convert-DNSDebugLogFile -InputFile "C:\Windows\System32\dns\dns.log"
C’est tout le point d’entrée. Tout le reste sur ce site concerne comment le faire à grande échelle, selon un planning, et sur plusieurs serveurs.
À quoi ressemble un journal de débogage DNS
Une entrée brute est une ligne unique avec des champs positionnels, certains entre crochets :
2026-01-20 23:00:16 0FE0 PACKET 000002C53117D990 UDP Rcv 10.0.0.2 c049 Q [0001 D NOERROR] A (3)odc(9)officeapps(4)live(3)com(0)
Après conversion, le même événement devient une ligne CSV que vous pouvez filtrer et trier :
DateTime;ThreadId;Context;PacketId;Protocol;Direction;ClientIP;Xid;Type;Opcode;FlagsHex;FlagsChar;ResponseCode;QuestionType;QuestionName;Information;Details;ComputerName
2026-01-20 23:00:16;0FE0;Packet;000002C53117D990;UDP;Rcv;10.0.0.2;c049;Query;Standard;0001;RecursionDesired;NOERROR;A;"odc.officeapps.live.com";"";"";dc01
Notez deux choses que le format brut rend difficiles et que le parseur gère pour vous :
- Le nom interrogé est stocké en notation DNS wire,
(3)odc(9)officeapps(4)live(3)com(0), et devient un FQDN normal. - Un événement unique n’est pas toujours une ligne unique. Les blocs de détails
PACKET et les messages d’événement continuent sur des lignes suivantes indentées. Le parseur les rattache à l’enregistrement auquel ils appartiennent au lieu de les ignorer ou de créer des lignes orphelines.
Chaque entrée contient jusqu’à 16 champs natifs — horodatage, protocole, direction, IP client, type de requête, nom interrogé, code de réponse, flags, et plus. La liste complète des colonnes est décrite dans Formats de sortie.
Pourquoi convertir
Dépannage
- Comprendre pourquoi un nom ne se résout pas, et si la requête a même atteint le serveur
- Identifier les clients ou applications mal configurés qui saturent le serveur
- Tracer l’origine réelle d’une requête problématique
- Vérifier les transferts de zone et le comportement général du DNS
- Classer les clients par volume de requêtes et repérer les plus bruyants
- Voir quels types d’enregistrements dominent votre trafic
- Détecter les erreurs de configuration qui causent des recherches inutiles
- Suivre la charge du serveur dans le temps au lieu de deviner
Analyse de sécurité
- Détecter le tunneling DNS et l’exfiltration de données (visible typiquement comme un trafic
TXT excessif — voir l’exemple d’analyse SQL Server) - Trouver les recherches vers des domaines de malwares et de commande et contrôle
- Reconnaître les schémas de requêtes d’un hôte compromis
- Surveiller les abus d’amplification DNS
- Reconstituer ce qui s’est passé lors d’un incident
- Respecter les obligations de journalisation et de conservation
- Garder une trace d’audit de l’activité réseau
- Produire des rapports pour la direction ou les auditeurs
Convert-DNSDebugLogFile lit le journal en flux et écrit le CSV en flux. Le fichier n’est jamais chargé entièrement en mémoire, donc un journal de 100 Mo consomme à peu près autant de RAM qu’un de 10 Mo. Les détails sont dans Performance.
Ce qu’il vous offre :
| Fonctionnalité | Détail |
|---|
| Mise en forme CSV cohérente | 18 colonnes, même ordre à chaque fois, quel que soit le contexte dans le journal |
| Enregistrements multi-lignes | Les blocs de détails PACKET et le texte des événements restent attachés à leur enregistrement |
| Versions du serveur DNS | Formats de journal de 2012 R2 à 2025 |
| Éditions PowerShell | Windows PowerShell 5.1+ et PowerShell 7.x |
| Taille des fichiers | Testé avec des journaux de plus de 100 Mo ; traitement en un seul passage |
| Validation d’en-tête | Rejette les fichiers qui ne sont pas des journaux de débogage DNS (peut être désactivé) |
| Statistiques | Regroupements journaliers optionnels, par contexte et par client/protocole/type |
| Support du pipeline | Get-ChildItem *.log | Convert-DNSDebugLogFile |
| Compression | Sortie ZIP optionnelle, généralement 90 % plus petite |
| Nettoyage source | Suppression optionnelle du journal après une exécution réussie |
| Journaux internationaux | Analyse et écrit les dates selon la culture, un journal de-DE peut être lu sur une station en-US |
| Chemins réseau | Lit les sources depuis des chemins SMB/UNC |
| Fichiers verrouillés | Lit les journaux que le serveur DNS (ou autre) a ouverts |
Journal actif vs journal archivé
Lire les journaux actifs avec précaution
Le module peut lire le fichier journal que le serveur DNS écrit en ce moment. C’est pratique pour un coup d’œil rapide, mais le fichier change pendant la conversion. Le résultat peut manquer les entrées les plus récentes ou se terminer par un enregistrement tronqué.
Pour tout ce qui est planifié ou critique en production, convertissez plutôt les fichiers journaux archivés et fermés, et ne combinez jamais un journal actif avec -RemoveSourceFile.
Le schéma pratique est d’activer la rotation des journaux sur le serveur DNS et de laisser la conversion planifiée ignorer le fichier le plus récent :
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 |
Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
Une implémentation complète basée sur une stratégie de groupe est documentée dans l’exemple de collecte pilotée par GPO.
Où aller ensuite
Licence et support
Licence MIT. Le support communautaire se fait via GitHub Issues ; les rapports de bugs et demandes de fonctionnalités sont les bienvenus.
2 - Formats de sortie
Les colonnes du fichier de données CSV, les deux fichiers statistiques optionnels, et des exemples réels de sorties que tu peux ouvrir avant de lancer quoi que ce soit.
Convert-DNSDebugLogFile produit jusqu’à trois fichiers par fichier journal d’entrée :
| Fichier | Contenu | Créé quand |
|---|
<name>.csv | Une ligne par entrée de journal analysée | -OutputType CSV ou Both |
<name>_Statistic.csv | Nombre d’enregistrements quotidiens par contexte | -OutputType Statistic ou Both |
<name>_PacketStatistic.csv | Nombre quotidien de requêtes par client, protocole, direction et type d’enregistrement | -OutputType Statistic ou Both |
Both est la valeur par défaut. La sortie est placée à côté du fichier d’entrée sauf si tu définis -OutputFile.
Les fichiers exemples liés sur cette page sont des résultats de conversion réels, pas des maquettes. Télécharge-en un et ouvre-le dans Excel avant de te lancer dans la conception d’un pipeline.
Le fichier de données CSV
Exemple de sortie :
Deux lignes issues d’une conversion réelle — une requête DNS et une note interne au serveur :
DateTime;ThreadId;Context;PacketId;Protocol;Direction;ClientIP;Xid;Type;Opcode;FlagsHex;FlagsChar;ResponseCode;QuestionType;QuestionName;Information;Details;ComputerName
2026-01-20 23:00:16;0FE0;Packet;000002C53117D990;UDP;Rcv;10.0.0.2;c049;Query;Standard;0001;RecursionDesired;NOERROR;A;"odc.officeapps.live.com";"";"";dc01
2026-01-20 23:00:16;DF0;Note;;;;;;;;;;;;"";"got GQCS failure on a dead socket context status=995, socket=904";"";dc01
Colonnes
Toujours 18 colonnes, toujours dans cet ordre :
| # | Colonne | Signification | Usage typique |
|---|
| 1 | DateTime | Horodatage de l’entrée | Filtrage temporel, jointure avec d’autres journaux |
| 2 | ThreadId | Thread de travail du serveur DNS | Rarement nécessaire ; utile pour corréler des problèmes internes au serveur |
| 3 | Context | Type d’entrée : Packet, Event, Note, DSPoll, Init, Lookup, Recurse, Remote, Tombstone | Premier filtre que tu appliqueras — Packet correspond au trafic DNS réel |
| 4 | PacketId | Identifiant interne du paquet | Jumeler une requête avec sa réponse |
| 5 | Protocol | UDP ou TCP | Les pics TCP peuvent indiquer de grosses réponses ou des transferts de zone |
| 6 | Direction | Rcv (requête reçue) ou Snd (réponse envoyée) | Séparer le volume des requêtes du volume des réponses |
| 7 | ClientIP | Adresse de l’hôte qui interroge | Analyse des plus gros émetteurs, cadrage d’incident |
| 8 | Xid | ID de transaction DNS (hexadécimal) | Faire correspondre requête et réponse |
| 9 | Type | Query ou Response | |
| 10 | Opcode | Standard, Notify, Update, Unknown | Sépare les mises à jour dynamiques et notifications de zone des recherches normales |
| 11 | FlagsHex | Flags bruts de l’en-tête (hexadécimal) | Pour une analyse approfondie du protocole |
| 12 | FlagsChar | Flags décodés : Authoritative, Truncated, RecursionDesired, RecursionAvailable | Version lisible des flags ci-dessus |
| 13 | ResponseCode | NOERROR, NXDOMAIN, SERVFAIL, … | Rapport de taux d’erreur, recherche d’échecs de résolution |
| 14 | QuestionType | Type d’enregistrement : A, AAAA, MX, PTR, TXT, … | Le volume TXT est un indicateur classique de tunneling |
| 15 | QuestionName | Nom interrogé en FQDN normal | Correspondance avec renseignements sur les menaces, rapports de domaines principaux |
| 16 | Information | Texte libre pour les entrées Event / Note ; pour les blocs de détails Packet, ligne d’en-tête TCP/UDP | Lecture des messages serveur |
| 17 | Details | Représentation JSON d’un bloc de détails Packet ; vide sinon | Inspection complète du paquet sans revenir au journal brut |
| 18 | ComputerName | Serveur source, depuis -ComputerName | Permet d’attribuer les données multi-serveurs |
Deux points à prévoir :
- Toutes les colonnes ne sont pas remplies pour chaque ligne. Seules les entrées
Packet ont une IP client, un nom de question et un code de réponse. Les lignes Note et Event portent leur texte dans Information et laissent les colonnes protocole vides. Conçois ton schéma de base de données et tes filtres de tableau de bord en conséquence. ComputerName est toujours la dernière colonne, même si tu n’utilises pas -ComputerName. Elle est alors simplement vide. Cela garantit une mise en page identique sur tous les serveurs pour concaténer des fichiers de plusieurs serveurs DNS sans étape de mappage des colonnes.
La colonne Détails
Les blocs de détails n’apparaissent que si le serveur DNS est configuré pour enregistrer les détails complets des paquets. Lorsqu’ils existent, le parseur les convertit en une seule valeur JSON pour que la ligne reste unique :
{
"Socket": "848",
"Remote": "addr 10.10.0.11, port 60580",
"Buflength": "0x10000 (65536)",
"Message": {
"XID": "0x0001",
"OPCODE": "0 (QUERY)",
"RCODE": "0 (NOERROR)",
"QUESTION": [ { "Name": "berlin.de", "QTYPE": "A (1)", "QCLASS": "1" } ],
"ANSWER": []
}
}
Analyser ces blocs prend du temps et rend le CSV beaucoup plus volumineux. Si tu n’en as pas besoin, utilise -NoDetailsParsing — la colonne reste présente mais vide, et la conversion est plus rapide. Voir Performance.
Les fichiers statistiques
Les statistiques sont des agrégats quotidiens. Utilise-les quand tu veux une tendance ou un résumé et que tu ne veux pas manipuler l’ensemble complet des enregistrements — ils sont des ordres de grandeur plus petits que le fichier de données.
Statistiques par contexte (*_Statistic.csv)
Répondent à la question : quelle quantité de quel type d’activité s’est produite par jour ?
Date;Context;Count;ComputerName
2026-01-20;Event;2;dc01
2026-01-20;Note;2;dc01
2026-01-20;Packet;12;dc01
| Colonne | Signification |
|---|
Date | Jour, toujours au format yyyy-MM-dd |
Context | Nom du contexte (Packet, Event, Note, …) |
Count | Nombre d’enregistrements de ce contexte ce jour-là |
ComputerName | Serveur source |
Fichiers exemples : en-US WithComputerName, en-US NoComputerName, de-DE WithComputerName, de-DE NoComputerName
Statistiques par paquet (*_PacketStatistic.csv)
Répondent à la question : qui a interrogé quoi, combien de fois, par jour ?
Date;ClientIP;Protocol;Direction;QuestionType;Count;ComputerName
2026-01-20;10.0.0.1;UDP;Rcv;A;3;dc01
2026-01-20;10.0.0.1;UDP;Snd;A;3;dc01
2026-01-20;10.0.0.2;UDP;Rcv;A;3;dc01
| Colonne | Signification |
|---|
Date | Jour, toujours au format yyyy-MM-dd |
ClientIP | Hôte qui interroge |
Protocol | UDP ou TCP |
Direction | Rcv ou Snd |
QuestionType | Type d’enregistrement DNS |
Count | Nombre de paquets correspondants ce jour-là |
ComputerName | Serveur source |
Fichiers exemples : en-US WithComputerName, en-US NoComputerName, de-DE WithComputerName, de-DE NoComputerName
Les totaux sont des sommes, pas des valeurs distinctes
Count est le nombre d’enregistrements dans ce groupe quotidien. Un client qui a demandé le même nom 500 fois contribue pour 500, pas 1. Si un nombre semble trop élevé, c’est généralement pour cette raison.
Les deux types de sortie respectent -Delimiter (par défaut ;) et -OutputCulture. Pour tout ce qui sera importé par une machine, écris des horodatages au format ISO-like :
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputCulture 'sv-SE'
Cela produit 2026-01-20 23:00:16, que SQL Server, Power BI et pandas lisent sans indication de format. Détails dans Paramètres et options.
3 - Paramètres et options
Ce que chaque option de Convert-DNSDebugLogFile modifie réellement, quand vous en avez besoin, et les pièges faciles à éviter.
Cette page explique les options en langage clair et dans l’ordre où vous en aurez généralement besoin. C’est un guide, pas une spécification — la liste autoritaire et toujours à jour des paramètres se trouve dans la référence de commande et dans :
Get-Help Convert-DNSDebugLogFile -Full
La version courte
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log"
Cette seule ligne vous donne déjà un comportement sensé : fichiers de données et de statistiques, délimiteur point-virgule, format de date de votre machine, validation de l’en-tête activée, journal source intact. Tout ce qui suit est du réglage fin.
| Option | Par défaut | Changez-la quand |
|---|
-InputFile | (obligatoire) | toujours |
-OutputFile | chemin d’entrée avec .csv | vous voulez la sortie ailleurs |
-Delimiter | ; | votre consommateur attend une virgule, une tabulation ou un pipe |
-ComputerName | vide | vous fusionnez des journaux de plusieurs serveurs |
-OutputType | Both | vous ne voulez que les données, ou seulement les synthèses |
-ContextFilter | All | vous ne vous intéressez qu’au trafic DNS réel |
-InputCulture | culture actuelle | le journal vient d’un serveur avec une autre locale |
-OutputCulture | culture actuelle | une machine lira le CSV |
-NoDetailsParsing | désactivé | le débit compte plus que les détails des paquets |
-CompressOutput | désactivé | vous archivez ou transférez les résultats |
-RemoveSourceFile | désactivé | nettoyage programmé, et vous faites confiance à la sortie |
-SkipHeaderValidation | désactivé | le fichier est valide mais l’en-tête est inhabituel |
Entrée et sortie
Chemin vers le journal à convertir. Accepte un tableau et l’entrée par pipeline — c’est pourquoi ceci fonctionne :
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" | Convert-DNSDebugLogFile
Get-ChildItem émet des objets avec une propriété FullName, et -InputFile l’accepte par nom de propriété (ses alias incluent FullName, Path, FilePath). Pas besoin de ForEach-Object.
Les chemins locaux et SMB/UNC fonctionnent tous les deux :
Convert-DNSDebugLogFile -InputFile "\\dc01\C$\Administration\Logs\DNSServer\dns.log"
La commande peut aussi ouvrir un journal que le serveur DNS a actuellement ouvert. Voir journaux actifs ci-dessous avant de vous y fier.
-OutputFile
Sans cette option, le CSV est créé à côté du fichier d’entrée, même nom de base, extension .csv. Avec, vous contrôlez la destination.
Cela doit être un chemin de fichier, pas un dossier
-OutputFile "D:\Processed\" ne signifie pas “écrire dans ce dossier”. Donnez le chemin complet incluant le nom du fichier : -OutputFile "D:\Processed\dns_data.csv".
Cela signifie aussi que -OutputFile n’a pas de sens quand vous traitez plusieurs fichiers en pipeline — chaque conversion écrirait au même endroit. Pour les traitements par lots, laissez cette option de côté et laissez chaque journal produire son propre CSV.
-Delimiter
Par défaut, c’est un point-virgule, car dans les locales où la virgule est le séparateur décimal, c’est ce qu’Excel attend. Utilisez -Delimiter "," pour les outils et bases de données qui attendent des valeurs séparées par des virgules classiques, ou -Delimiter "`t" pour une tabulation.
Quelle que soit votre sélection, utilisez la même valeur à l’import. Un décalage est la cause numéro un de “tout est dans une seule colonne”.
Étiquetage et filtrage
-ComputerName
Remplit la colonne ComputerName. La colonne existe de toute façon ; cela lui donne juste une valeur.
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ComputerName $env:COMPUTERNAME
Ce n’est pas un paramètre de télécommande
Malgré le nom (et les alias -Server / -DNSServer / -HostName), -ComputerName ne se connecte pas à quoi que ce soit. Pas de WinRM, pas d’exécution distante. Il écrit juste une étiquette dans la sortie. Pour lire un journal distant, pointez -InputFile vers un chemin UNC.
Mettez-le toujours quand plusieurs serveurs alimentent un même jeu de données — sinon vous ne pourrez pas dire ensuite de quel DC vient une ligne.
-OutputType
CSV — fichier de données uniquementStatistic — les deux fichiers agrégés seulement, pas les données ligne par ligneBoth — les trois fichiers (par défaut)
Statistic est l’option rapide et légère quand vous ne voulez que les tendances journalières. CSV est adapté quand un système en aval fait sa propre agrégation.
-ContextFilter
Un journal de débogage DNS mélange le trafic réel des requêtes avec le bavardage interne du serveur. -ContextFilter décide ce qui survit dans la sortie.
# uniquement le trafic DNS réel
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter Packet
# trafic plus événements serveur, mais pas les notes de diagnostic
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter Packet, Event
| Valeur | Contient |
|---|
All | tout (par défaut) |
Packet | requêtes et réponses DNS — les données dont la plupart des analyses ont besoin |
Event | événements serveur, ex. “Le serveur DNS a démarré” |
Note | notes et avertissements de diagnostic, ex. erreurs de socket |
D’autres types de contexte (DSPoll, Init, Lookup, Recurse, Remote, Tombstone) apparaissent sous All.
Filtrer sur Event ou Note remplit seulement DateTime, ThreadId, Context et Information — les colonnes de protocole restent vides car ces entrées ne portent pas cette information.
-ContextFilter Packet est le choix habituel pour les pipelines de sécurité et de reporting : il enlève le bruit et réduit nettement la sortie.
Journaux internationaux
Le serveur DNS écrit les horodatages dans la locale Windows de la machine où il tourne. Un DC allemand écrit 20.01.2026 23:00:16 ; un serveur US écrit 1/20/2026 11:00:16 PM. Si la locale de votre poste diffère de celle du serveur, l’analyse échoue — ou pire, échange silencieusement jour et mois.
Indiquez au parseur la locale utilisée par le journal source :
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns-berlin.log" -InputCulture 'de-DE'
| Culture | Format d’horodatage dans le journal |
|---|
de-DE | JJ.MM.AAAA HH:MM:SS |
en-US | M/J/AAAA H:MM:SS AM/PM |
en-GB | JJ/MM/AAAA HH:MM:SS |
sv-SE | AAAA-MM-JJ HH:MM:SS |
Par défaut, c’est la culture de la session qui exécute la commande. Dans un environnement à locales mixtes, définissez-la explicitement plutôt que de compter sur ce défaut — et souvenez-vous qu’une tâche planifiée lancée en tant que SYSTEM peut ne pas avoir la culture que vous avez testée en interactif.
-OutputCulture
Contrôle comment les horodatages sont écrits dans le CSV :
# sortie de type ISO que SQL Server, Power BI et pandas comprennent tous
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputCulture 'sv-SE'
# même effet, culture invariante explicite
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" `
-OutputCulture ([System.Globalization.CultureInfo]::InvariantCulture)
Règle générale : si un humain ouvre le fichier dans Excel, adaptez à la culture locale. Si une machine le lit, utilisez sv-SE ou la culture invariante et ne vous souciez plus des paramètres régionaux à l’import.
Les deux paramètres sont indépendants — vous pouvez lire un journal suédois et écrire une sortie au format US.
Vitesse et stockage
-NoDetailsParsing
Si le serveur DNS journalise les détails complets des paquets, le parseur transforme chaque bloc de détails en JSON dans la colonne Details. C’est utile, mais c’est aussi la partie la plus coûteuse du traitement et cela gonfle le CSV.
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -NoDetailsParsing
La colonne reste présente mais vide ; la ligne d’en-tête des détails TCP/UDP est toujours disponible dans Information. Sur des journaux riches en blocs de détails, cela peut réduire le temps de traitement de 30 à 50 %. Utilisez-le dès que les informations au niveau des requêtes suffisent.
-CompressOutput
Compresse les fichiers CSV générés en ZIP et supprime les fichiers non compressés. dns.log produit dns.zip au lieu de dns.csv.
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput
Un CSV de cette forme se compresse typiquement à 90 % ou plus, donc c’est presque un gain de stockage gratuit pour les archives et pour l’envoi des fichiers sur le réseau.
-RemoveSourceFile
Supprime le fichier source .log après une conversion réussie — le journal n’est supprimé que si tous les fichiers de sortie ont été créés.
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput -RemoveSourceFile
La suppression est définitive
Il n’y a pas de corbeille ici. Validez votre sortie sur des journaux réels avant d’activer cela dans une tâche planifiée, et ne le pointez jamais vers un fichier journal actif.
La commande refuse délibérément de combiner -RemoveSourceFile avec -SkipHeaderValidation, pour que vous ne puissiez pas supprimer un fichier jamais confirmé comme journal DNS.
Filets de sécurité
Par défaut, la commande vérifie que le fichier est bien un journal de débogage DNS Server avant de le parser. Cela évite la classique erreur de pointer la tâche vers le mauvais dossier.
Désactivez-le uniquement pour des cas vraiment inhabituels : journaux édités à la main, extraits pré-filtrés, formats personnalisés. Gardez-le activé partout ailleurs — c’est peu coûteux et c’est ce qui vous protège d’une faute de frappe et d’une montagne de lignes inutiles.
-WhatIf et -Confirm
La commande supporte les deux. -WhatIf est la bonne façon de voir ce qu’une nouvelle tâche par lot toucherait :
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Convert-DNSDebugLogFile -RemoveSourceFile -WhatIf
-Confirm demande une confirmation avant de traiter chaque fichier, avant de supprimer un fichier source, et avant d’écraser une sortie existante.
Journaux actifs
Convert-DNSDebugLogFile peut lire un fichier que le serveur DNS a ouvert. Pratique pour un coup d’œil ad hoc sur ce qui se passe en ce moment.
Pas pour les exécutions planifiées ou en production
Un journal actif change pendant sa lecture. La sortie peut manquer des entrées écrites pendant la conversion et son dernier enregistrement peut être tronqué. Relancer la commande donne un résultat différent.
Pour une sortie reproductible, activez le basculement des journaux sur le serveur DNS et ne convertissez que les fichiers fermés et tournés — par exemple en sautant le plus récent :
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 |
Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
Mise en pratique
Une invocation typique en production sur un contrôleur de domaine :
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 |
Convert-DNSDebugLogFile `
-ComputerName $env:COMPUTERNAME `
-Delimiter ';' `
-OutputType Both `
-ContextFilter Packet `
-OutputCulture 'sv-SE' `
-CompressOutput
À lire comme : prenez chaque journal tourné sauf l’actif, ne gardez que le trafic DNS, étiquetez chaque ligne avec le nom du serveur, écrivez des horodatages lisibles par machine, et laissez des archives compressées. La version complète pour tâche planifiée et stratégie de groupe est dans l’exemple de collecte pilotée par GPO.
4 - Performance
Comment le parseur gère des journaux de 100 Mo sans saturer la mémoire de votre serveur, et ce que vous pouvez faire pour garder des conversions rapides.
Les journaux de débogage DNS sur un contrôleur de domaine très actif sont volumineux. Convert-DNSDebugLogFile est conçu pour ce cas : il a été testé avec des journaux de 100 Mo et plus, et les traite en quelques minutes sur du matériel serveur ordinaire.
Pourquoi c’est rapide
Vous n’avez pas besoin de connaître tout cela pour utiliser le module, mais cela explique le comportement que vous observerez.
| Technique | Effet que vous remarquez |
|---|
StreamReader / StreamWriter avec des tampons de 64 Ko | Le fichier est lu et écrit par morceaux au lieu d’un gros Get-Content |
| Streaming, passage unique | L’utilisation mémoire reste à peu près constante, quelle que soit la taille du journal |
Opérations sur chaînes (.Substring(), .IndexOf()) au lieu d’expressions régulières | Beaucoup moins de CPU par ligne, et il y a des millions de lignes |
CSV écrit à la main au lieu de Export-Csv | Pas de surcharge de pipeline d’objets par enregistrement |
| Agrégation basée sur des tables de hachage pour les statistiques | Les regroupements coûtent presque rien en plus pendant le même passage |
La conséquence importante : le journal complet n’est jamais chargé en mémoire. Un journal de 500 Mo ne nécessite pas 500 Mo de RAM. C’est la différence entre le module et l’approche « lire le fichier, le découper, construire des objets » que la plupart des scripts maison utilisent — cette approche fonctionne bien sur un échantillon de 5 Mo mais plante sur un vrai DC.
Tirer le meilleur parti d’une exécution
Convertir des morceaux tournés, pas un fichier géant
Configurez le serveur DNS pour faire tourner le journal à une taille gérable — 50 à 200 Mo est une bonne plage. Plusieurs fichiers moyens se convertissent en un temps prévisible et permettent à une tâche planifiée de finir dans sa fenêtre. Un fichier qui ne cesse de grossir finit par ne plus y arriver.
La rotation vous donne aussi des fichiers fermés avec lesquels travailler, ce que vous voulez de toute façon :
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 |
Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
Sauter l’analyse détaillée quand ce n’est pas nécessaire
Si le serveur DNS écrit les détails complets des paquets, transformer ces blocs en JSON est la partie la plus coûteuse de la conversion.
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -NoDetailsParsing
Attendez-vous à des exécutions 30 à 50 % plus rapides sur les journaux contenant beaucoup de blocs détaillés, plus un CSV beaucoup plus petit. Vous obtenez toujours les données au niveau des requêtes et la ligne d’en-tête détaillée TCP/UDP dans Information. Voir Paramètres et Options.
Filtrer tôt
-ContextFilter Packet élimine les notes et événements du serveur avant qu’ils ne soient écrits. Moins de sortie signifie moins d’E/S, des fichiers plus petits, et moins de travail en aval.
Demander uniquement ce dont vous avez besoin
-OutputType Statistic évite complètement d’écrire le CSV ligne par ligne. Si votre tableau de bord affiche seulement des comptes journaliers, c’est de loin l’option la moins coûteuse.
Convertir localement, déplacer les résultats
Le module lit les chemins SMB/UNC, mais transférer un journal brut de 200 Mo sur le réseau pour le parser centralement est la méthode lente. Convertissez sur le serveur DNS, puis déplacez le CSV (compressé) — c’est généralement un dixième des octets. C’est le principe derrière l’exemple de collecte pilotée par GPO.
Compresser pour le transfert et l’archivage
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput
Un CSV de cette forme se réduit typiquement de 90 % ou plus. La compression coûte un peu de CPU à la fin de l’exécution et économise beaucoup d’espace disque et de bande passante ensuite.
Quand une exécution est plus lente que prévu
Vérifiez ces points dans l’ordre :
- Disque, pas CPU. La conversion est gourmande en E/S. Un journal sur un volume très occupé, ou lu via un lien lent, domine le temps d’exécution.
- Blocs détaillés. Si le journal contient les détails complets des paquets et que vous n’avez pas utilisé
-NoDetailsParsing, c’est là que le temps se passe. - Taille du fichier. Un seul journal de plusieurs gigaoctets prendra du temps quoi qu’il arrive. Réglez cela avec la rotation, pas avec des paramètres.
- Antivirus. L’analyse en temps réel du journal source et du CSV généré peut doubler le coût effectif des E/S. Une exclusion pour le répertoire des journaux est une mesure courante et raisonnable.
- Pression mémoire. Le module utilise le streaming, donc ce ne devrait pas être la cause — mais un serveur déjà en swap ralentira tout.
D’autres symptômes et solutions sont rassemblés dans Dépannage.
5 - Intégration avec les outils d’analyse
Importer le CSV converti dans Excel, Power BI, SQL Server, un SIEM ou un notebook Python — y compris les paramètres de délimiteur et de date qui font que ça marche du premier coup.
Le but de la conversion d’un journal de débogage DNS est ce qui se passe ensuite. Le CSV a été choisi parce que tout le monde le lit — mais « tout le monde lit le CSV » cache deux réglages qui décident si l’import est simple ou une après-midi de bidouillage.
Deux réglages qui décident de tout
Délimiteur. Par défaut ;. Gardez-le pour Excel dans les locales qui utilisent la virgule comme séparateur décimal. Passez à , pour la plupart des bases de données et outils de data science. Quel que soit votre choix, indiquez-le à la partie qui importe.
Format de date. -OutputCulture contrôle la façon dont les horodatages sont écrits. Pour tout ce qui est lu par une machine, utilisez sv-SE (ou culture invariante) pour que DateTime sorte sous la forme 2026-01-20 23:00:16 :
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputCulture 'sv-SE'
Tous les consommateurs ci-dessous comprennent ce format sans indice. Une sortie spécifique à une locale comme 20.01.2026 sera importée en texte ou, pire, mal interprétée comme mois/jour.
Microsoft Excel
Le moyen le plus rapide pour consulter un journal converti unique.
- Avec le délimiteur par défaut
; et une locale qui l’attend, un double-clic ouvre le fichier avec les colonnes correctement séparées. - Si tout atterrit dans la colonne A, le délimiteur ne correspond pas à votre réglage Excel. Relancez avec
-Delimiter "," ou importez via Données → À partir du texte/CSV et choisissez le délimiteur là. - Transformez la plage en tableau (
Ctrl+T) et créez un tableau croisé dynamique sur ClientIP, QuestionName ou QuestionType. Les principaux clients et domaines prennent environ une minute. - Pour plus de quelques centaines de milliers de lignes, utilisez plutôt Power Query ou une des autres options ci-dessous.
Les fichiers *_Statistic.csv et *_PacketStatistic.csv sont généralement de meilleures cibles pour Excel — ils sont pré-agrégés et restent petits. Voir Formats de sortie.
Power BI
Importez les fichiers CSV et créez des tableaux de bord pour l’activité DNS, les principaux clients, les tendances des requêtes et les taux d’erreur.
- Pointez Power Query vers le dossier contenant vos fichiers convertis plutôt qu’un seul fichier. La structure est identique entre serveurs et jours, donc les fichiers s’additionnent simplement.
- La colonne
ComputerName permet de faire un rapport multi-serveurs — définissez -ComputerName lors de la conversion sinon vous ne pourrez pas filtrer par serveur. ResponseCode et QuestionType sont des filtres naturels ; DateTime devient votre axe temporel.- Alimenter Power BI avec
*_PacketStatistic.csv au lieu du fichier complet garde le modèle léger quand vous avez seulement besoin des tendances journalières.
Bases de données SQL
Chargez en masse le CSV dans SQL Server, PostgreSQL ou tout autre système SQL, pour une conservation à long terme et des requêtes répétables.
Un tutoriel prêt à l’emploi — définition de table, conversion, import SqlBulkCopy et requête de détection d’activité TXT suspecte — est documenté dans Workflow d’analyse de sécurité avec SQL Server.
Points à planifier avant la première charge :
- Utilisez
-OutputCulture 'sv-SE' pour que les horodatages arrivent dans une colonne datetime2 sans astuces de conversion. Information et Details peuvent être longs ; donnez-leur nvarchar(max).- Indexez ce que vous interrogez réellement — typiquement
DateTime, ClientIP et QuestionName. - Gardez
-ComputerName renseigné pour que les lignes restent attribuables après fusion.
Systèmes SIEM
Splunk, Elastic, Sentinel et plateformes similaires ingèrent le CSV pour corrélation avec d’autres télémétries de sécurité et pour les alertes.
- Envoyez la sortie compressée (
-CompressOutput) — elle fait environ un dixième de la taille et la plupart des collecteurs la décompressent eux-mêmes. - Définissez le mapping des champs une fois ; la disposition des colonnes ne change jamais entre les exécutions ou serveurs, y compris la colonne
ComputerName toujours présente à la fin. - Faites dédupliquer votre collecteur, ou archivez les fichiers
.log traités. Un job de conversion qui retraiterait les mêmes logs tournés renverrait sinon des lignes identiques. -ContextFilter Packet limite le volume d’ingestion (et le coût de licence) quand les notes serveur ne font pas partie de vos cas d’usage.
Python, R et outils de data science
La sortie structurée est prête pour la détection d’anomalies, la mise en référence et les analyses personnalisées.
import pandas as pd
df = pd.read_csv(
r"C:\Administration\Logs\DNSServer\dns.csv",
sep=";",
parse_dates=["DateTime"],
)
# top 20 des noms interrogés, uniquement les requêtes
top = (
df[df["Direction"] == "Rcv"]
.groupby("QuestionName")
.size()
.sort_values(ascending=False)
.head(20)
)
print(top)
parse_dates fonctionne directement quand vous avez exporté avec -OutputCulture 'sv-SE'. À partir de là, pandas, scikit-learn ou R gèrent le clustering, la saisonnalité et la détection d’anomalies comme d’habitude.
Rester dans PowerShell
Pas besoin de quitter PowerShell pour une réponse rapide :
$dns = Import-Csv "C:\Administration\Logs\DNSServer\dns.csv" -Delimiter ';'
# clients les plus bruyants
$dns | Where-Object Direction -eq 'Rcv' |
Group-Object ClientIP |
Sort-Object Count -Descending |
Select-Object -First 10 Count, Name
# recherches échouées
$dns | Where-Object ResponseCode -eq 'NXDOMAIN' |
Group-Object QuestionName |
Sort-Object Count -Descending |
Select-Object -First 10 Count, Name
Import-Csv lit tout le fichier en mémoire, donc c’est bien pour un fichier tourné mais pas adapté à un export de plusieurs gigaoctets — c’est là que les bases de données et SIEM entrent en jeu.
6 - Bonnes pratiques opérationnelles
Ce qu’il faut bien faire avant de laisser une conversion de journal DNS s’exécuter sans surveillance sur des contrôleurs de domaine en production.
Convertir un journal à la main est facile. Le faire tourner chaque nuit sur chaque contrôleur de domaine, pendant des années, sans que personne ne le regarde, c’est la partie qui demande un peu de conception. Voici les points qui comptent en pratique.
1. Convertir les journaux archivés, pas celui en cours
Activez la rotation des journaux sur le serveur DNS et ne convertissez que les fichiers fermés. Le module peut lire le journal sur lequel le serveur DNS écrit actuellement, mais ce fichier change pendant la conversion : les entrées les plus récentes peuvent manquer et le dernier enregistrement peut être tronqué. Deux exécutions produisent deux résultats différents.
Le modèle standard ignore le fichier le plus récent :
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 |
Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
Ne jamais combiner un journal actif avec -RemoveSourceFile
Supprimer un fichier sur lequel le serveur DNS écrit encore n’est pas une découverte que vous voulez faire après coup. Limitez -RemoveSourceFile aux journaux archivés et fermés.
Compromis à garder en tête : sur un serveur à faible volume, la rotation peut prendre plus d’un jour, donc les données du jour en cours restent non converties jusqu’à la rotation du fichier. Ajustez le seuil de rotation en conséquence.
2. Planifiez-le, et donnez au travail une identité qui fonctionne
Le Planificateur de tâches est l’endroit habituel — une exécution quotidienne est un bon choix par défaut. Une implémentation complète via GPO pour les contrôleurs de domaine est documentée dans l’exemple de collecte pilotée par GPO, et une tâche autonome dans l’exemple de tâche planifiée.
Trois pièges courants :
- Découverte du module. Une tâche exécutée en tant que
SYSTEM avec -NoProfile ne voit que les chemins de modules machine-wide. Installez le module pour toute la machine, ou ajoutez un Import-Module explicite dans l’action de la tâche. - Culture. Le compte qui exécute la tâche peut ne pas avoir la locale avec laquelle vous avez testé en interactif. Spécifiez explicitement
-InputCulture et -OutputCulture au lieu de compter sur la valeur par défaut. - Accès réseau. Si la source ou la destination est un chemin UNC,
SYSTEM s’authentifie en tant que compte ordinateur. Accordez les droits de partage et NTFS au compte ordinateur (ou au groupe Domain Controllers), ou exécutez la tâche avec un compte de service dédié.
3. Faites tourner la rotation à une taille que vous pouvez traiter
50 à 200 Mo par fichier maintiennent les conversions prévisibles et permettent à un travail nocturne de finir dans sa fenêtre. Un fichier qui grandit sans fin ne le permet pas. Voir Performance.
4. Validez les premiers résultats avant d’automatiser
Lancez la conversion manuellement sur deux ou trois vrais journaux et ouvrez vraiment le CSV :
- Les horodatages sont-ils corrects — pas d’inversion jour/mois ? (Si oui, définissez
-InputCulture.) - Le délimiteur correspond-il à ce que votre consommateur attend ?
- Le champ
ComputerName est-il rempli ? - Les contextes dont vous avez besoin sont-ils présents, et ceux dont vous n’avez pas besoin sont-ils filtrés ?
-WhatIf vous montre quels fichiers un lot toucherait avant de les toucher :
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Convert-DNSDebugLogFile -RemoveSourceFile -WhatIf
5. Décidez ce qu’il advient des journaux traités
Un travail qui convertit simplement « tous les journaux sauf le plus récent » retraitera les mêmes fichiers chaque nuit. C’est robuste et simple, mais cela écrase les sorties et peut injecter des lignes dupliquées dans ce qui les ingère.
Choisissez une option :
- déplacer les fichiers
.log traités dans un dossier d’archive - les supprimer avec
-RemoveSourceFile une fois que vous avez confiance dans la chaîne - faire dédupliquer le collecteur en aval
Quelle que soit votre décision, notez-la — c’est ce détail qui embrouille le prochain administrateur.
6. Planifiez le stockage et la rétention
La compression (-CompressOutput) réduit généralement le CSV de 90 % ou plus, mais le volume s’accumule quand même. Estimez à partir de votre taux de requêtes réel et de votre obligation de rétention, et fixez une date de fin pour les données au lieu de les laisser croître indéfiniment.
-OutputType Statistic mérite d’être envisagé pour une rétention longue : les agrégats quotidiens sont minuscules et répondent souvent aux questions de tendance pour lesquelles les données détaillées anciennes étaient conservées.
7. Traitez la sortie comme sensible
Les journaux DNS analysés décrivent votre structure de noms interne et qui a cherché quoi. C’est plus révélateur que la plupart des journaux d’infrastructure, et selon votre juridiction cela peut être considéré comme des données personnelles.
- Restreignez les permissions NTFS et de partage sur les dossiers de sortie.
- Ne déposez pas les CSV sur un partage de fichiers généraliste « temporairement ».
- Incluez les données des journaux DNS dans votre politique de rétention et de suppression, pas seulement dans votre politique de sauvegarde.
- La sortie compressée est plus petite, pas protégée — utilisez le chiffrement ou le contrôle d’accès là où c’est important.
8. Gardez la validation d’en-tête activée
La vérification par défaut qu’un fichier est bien un journal de débogage DNS ne coûte rien et évite qu’un chemin mal tapé produise des milliers de lignes absurdes. Utilisez -SkipHeaderValidation uniquement pour des formats vraiment inhabituels — et notez que la commande refuse de le combiner avec -RemoveSourceFile pour cette raison précise.
9. Surveillez le travail, pas seulement le serveur
Une conversion sans surveillance qui s’arrête silencieusement est pire qu’aucune conversion, car le trou n’est remarqué que lorsqu’on a besoin des données.
- Surveillez la sortie d’erreur non nulle ; l’implémentation de référence GPO lance volontairement une erreur quand
$Error.Count -gt 0 pour que la tâche signale un échec. - Alertez sur le dernier code de résultat de la tâche planifiée, pas seulement sur son existence.
- Vérifiez que les fichiers de sortie apparaissent bien avec des horodatages récents.
- Surveillez l’espace disque libre sur le volume des journaux et sur la cible de sortie.
Les causes courantes d’échec — accès refusé, journaux corrompus, en-têtes invalides — sont couvertes dans Dépannage.
10. Documentez le flux de travail
Où les journaux sont écrits, quand le travail s’exécute, quels paramètres sont utilisés, où la sortie va, qui la consomme, et combien de temps elle est conservée. Six lignes dans votre wiki opérationnel. C’est ce qui rend la configuration auditable et transmissible.
7 - Dépannage
Symptômes que vous êtes susceptible de rencontrer lors de la conversion des journaux de débogage DNS, leurs causes et comment les résoudre.
« Le fichier n’est pas un fichier de journal de débogage DNS valide »
La vérification de l’en-tête a rejeté l’entrée. En général, le chemin est simplement incorrect — un fichier .log dans le même dossier qui n’est pas un journal de débogage DNS, ou un fichier qui ne contient qu’un en-tête tourné.
Procédez ainsi :
Ouvrez le fichier. Un journal de débogage DNS commence par une ligne d’en-tête telle que Message logging started at … et continue avec des entrées de requêtes horodatées.
Confirmez que la journalisation de débogage DNS est bien activée et écrit dans le chemin attendu :
Get-DnsServerDiagnostics | Select-Object Enable, LogFilePath, MaxMBFileSize
Si le fichier est vraiment un journal DNS mais que l’en-tête est inhabituel — modifié manuellement, pré-filtré, une exportation personnalisée — contournez la vérification :
Convert-DNSDebugLogFile -InputFile "C:\Logs\odd.log" -SkipHeaderValidation
Gardez la validation activée partout ailleurs. Notez que -SkipHeaderValidation ne peut pas être combiné avec -RemoveSourceFile, donc un fichier non vérifié ne peut jamais être supprimé par la conversion.
Le fichier de sortie est vide ou contient beaucoup moins de lignes que prévu
Vérifiez, dans cet ordre :
- Le journal contient-il des entrées de requêtes ? Un journal fraîchement tourné peut ne contenir qu’un en-tête si aucune requête n’a encore eu lieu.
- Un
-ContextFilter est-il utilisé ? -ContextFilter Packet supprime par conception les entrées Event et Note. Si vous avez filtré sur Event ou Note, la plupart des colonnes seront aussi vides — ces types d’entrées ne contiennent que DateTime, ThreadId, Context et Information. - Le journal source était-il actif ? Un fichier sur lequel le serveur DNS écrit encore peut changer pendant la conversion ; les entrées les plus récentes peuvent manquer et le dernier enregistrement peut être tronqué. Convertissez un journal tourné et fermé lorsque vous avez besoin d’une sortie complète.
- Le fichier est-il corrompu ou tronqué ? Vérifiez la fin du journal pour une ligne partiellement écrite.
Les dates sont incorrectes, décalées ou le jour et le mois sont inversés
Le journal a été écrit par un serveur avec une locale Windows différente de celle de la session effectuant la conversion. 20.01.2026 et 01/20/2026 décrivent le même moment, mais seulement si les deux parties s’accordent sur le format.
# le journal vient d’un serveur allemand
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns-berlin.log" -InputCulture 'de-DE'
Définissez explicitement -InputCulture dans les tâches planifiées plutôt que de compter sur la culture du compte qui les exécute. Si la sortie doit être lisible par une machine, ajoutez -OutputCulture 'sv-SE'. Plus de détails dans Paramètres et options.
Tout se retrouve dans une seule colonne après l’import
Mauvais délimiteur. Le module écrit ; par défaut ; votre consommateur attendait , (ou inversement).
Relancez la conversion avec le délimiteur attendu par le consommateur :
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -Delimiter ","
…ou indiquez au programme d’importation quel délimiteur utilise le fichier — dans Excel via Données → À partir du texte/CSV, dans PowerShell via Import-Csv -Delimiter ';'.
« Accès refusé »
- Le répertoire des journaux DNS nécessite généralement des droits administratifs. Lancez PowerShell en mode administrateur, ou exécutez la tâche planifiée avec un compte ayant les droits.
- Vérifiez aussi les droits d’écriture sur le répertoire de sortie, pas seulement les droits de lecture sur le journal.
- Pour les chemins SMB/UNC : une tâche exécutée en tant que
SYSTEM s’authentifie sur le réseau en tant que compte ordinateur. Accordez les droits de partage et NTFS à ce compte ordinateur (ou au groupe Domain Controllers), ou utilisez un compte de service dédié. - Si
-RemoveSourceFile échoue à la fin d’une exécution par ailleurs réussie, le compte peut lire le journal mais pas le supprimer.
Le traitement est très lent
- Commencez par le disque — la conversion est limitée par les E/S. Un volume occupé ou un chemin réseau lent domine le temps d’exécution.
- Utilisez
-NoDetailsParsing si vous n’avez pas besoin du JSON détaillant les paquets ; sur des journaux très détaillés, cela économise 30 à 50 %. - Utilisez
-ContextFilter Packet pour écrire moins. - Divisez les journaux énormes avec la rotation des journaux du serveur DNS au lieu de convertir un seul fichier gigantesque.
- Envisagez une exclusion antivirus pour le répertoire des journaux.
Plus d’infos dans Performance.
La sortie compressée est plus volumineuse que prévu
Les journaux avec un contenu très diversifié — de nombreux domaines uniques, de nombreux clients distincts — se compressent moins bien que les journaux répétitifs. C’est normal. ZIP réalise généralement une réduction substantielle ; si ce n’est pas le cas, vérifiez si la colonne Details gonfle le fichier et si vous en avez vraiment besoin.
Les statistiques ne correspondent pas à ce que j’attendais
- Confirmez que vous avez utilisé
-OutputType Both ou -OutputType Statistic. Avec -OutputType CSV, aucun fichier de statistiques n’est généré. Count est un total, pas un compte distinct. Un client demandant le même nom 500 fois contribue pour 500. C’est la cause la plus fréquente du « ce nombre ne peut pas être correct ».- Les statistiques sont regroupées par jour. Un journal couvrant deux jours produit des lignes pour les deux.
- Si
ComputerName est vide dans les fichiers de statistiques, -ComputerName n’a pas été défini lors de la conversion.
La tâche planifiée fonctionne en mode interactif mais pas en tâche
Presque toujours l’une des trois causes :
- Module introuvable.
SYSTEM avec -NoProfile ne voit que les chemins de modules machine-wide. Installez le module machine-wide ou ajoutez un Import-Module DNSServer.DebugLogParser explicite dans l’action de la tâche. - Mauvaise culture. La locale du compte de la tâche diffère de la vôtre. Définissez explicitement
-InputCulture et -OutputCulture. - Politique d’exécution ou script non signé. Adaptez le
-ExecutionPolicy de la tâche à votre politique de signature, et débloquez les fichiers copiés depuis ailleurs.
Exécutez manuellement la ligne de commande exacte de la tâche dans le même contexte (par exemple avec PsExec en tant que SYSTEM) pour reproduire le problème.
Signaler un problème
Si rien de tout cela ne vous aide :
Mettez à jour vers la dernière version du module et réessayez.
Cherchez dans les issues GitHub le même symptôme.
Rassemblez les diagnostics :
$PSVersionTable
Get-Module DNSServer.DebugLogParser -ListAvailable | Select-Object Name, Version, Path
Get-Culture
ainsi que la commande exacte que vous avez lancée, le message d’erreur complet incluant la pile d’appels, et — si vous pouvez le partager — un petit extrait anonymisé du journal reproduisant le problème.
Ouvrez une nouvelle issue avec ces informations.
8 - Référence des commandes du module
Ici, tu peux trouver une référence pour toutes les commandes du module. Cette référence est conçue pour t’aider à trouver rapidement la commande dont tu as besoin et comprendre comment l’utiliser efficacement.
En cliquant sur une commande, tu seras dirigé vers une page détaillée qui fournit des informations complètes sur la commande, y compris sa syntaxe, ses paramètres, des exemples, ainsi que des notes ou astuces supplémentaires pour son utilisation.
8.1 - Convert-DNSDebugLogFile
SYNOPSIS
Transforme les journaux de débogage DNS de Windows Server en un format CSV structuré pour analyse et rapports.
SYNTAX
__AllParameterSets
Convert-DNSDebugLogFile [-InputFile] <string[]> [[-OutputFile] <string>] [[-Delimiter] <string>]
[[-ComputerName] <string>] [[-OutputType] <string>] [[-ContextFilter] <string[]>]
[[-InputCulture] <cultureinfo>] [[-OutputCulture] <cultureinfo>] [-SkipHeaderValidation]
[-RemoveSourceFile] [-CompressOutput] [-NoDetailsParsing] [-WhatIf] [-Confirm]
ALIASES
Cette cmdlet possède les alias suivants,
DESCRIPTION
Convertit les fichiers journaux de débogage DNS de Windows Server en données CSV structurées pouvant être analysées
dans Excel, Power BI, bases de données SQL ou outils SIEM.
Conçu pour l’analyse de sécurité, la
surveillance des performances, le dépannage et les rapports de conformité.
La cmdlet analyse les journaux de débogage DNS et génère une sortie CSV cohérente pour l’analyse.
La sortie CSV contient 18 colonnes, dont une colonne Information pour le texte événementiel/diagnostique,
une colonne JSON optionnelle Details pour les blocs de détails des paquets, et une colonne ComputerName
toujours présente (vide sauf si spécifiée).
FONCTIONNALITÉS CLÉS :
- Traitement en streaming évitant de charger le fichier complet en mémoire (adapté aux très gros journaux)
- Analyse haute performance optimisée pour les gros fichiers (100 Mo+)
- Délimiteur CSV personnalisable (par défaut : point-virgule)
- Résumés statistiques optionnels avec métriques agrégées
- Filtrage contextuel (Packet, Event, Note et autres contextes) pour cibler certains types d’entrées
- Analyse et formatage des dates sensibles à la culture pour serveurs internationaux
- Support du pipeline pour traitement par lots de plusieurs fichiers
- Compression optionnelle des fichiers de sortie (format ZIP)
- Suppression automatique optionnelle des fichiers sources après traitement
- Validation des en-têtes pour garantir l’intégrité des données
FORMAT DE SORTIE :
La colonne ComputerName est toujours incluse à la fin de chaque enregistrement.
Si le paramètre -ComputerName
n’est pas spécifié, la colonne restera vide.
Cela garantit une structure de sortie cohérente
pour les scénarios de consolidation multi-serveurs.
PERFORMANCE :
Optimisé avec StreamReader/StreamWriter et tampons de 64 Ko, traitement en streaming pour
une gestion mémoire efficace des gros fichiers, opérations sur chaînes au lieu de regex, génération manuelle du CSV,
et collecte efficace des statistiques via tables de hachage.
COMPATIBILITÉ :
- PowerShell 5.1+ (éditions Desktop et Core)
- Windows Server 2016+
- Formats de journaux DNS Server 2012 R2 à 2025
EXAMPLES
EXEMPLE 1
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log"
Convertit le journal de débogage DNS avec les paramètres par défaut (fichiers de données et statistiques avec délimiteur point-virgule).
Sortie :
- C:\Logs\dns.csv
- C:\Logs\dns_Statistic.csv
- C:\Logs\dns_PacketStatistic.csv
EXEMPLE 2
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputType CSV
Génère uniquement le fichier de données sans statistiques.
Sortie : C:\Logs\dns.csv
EXEMPLE 3
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputType Statistic
Génère uniquement les fichiers statistiques avec métriques agrégées.
Sortie :
- C:\Logs\dns_Statistic.csv
- C:\Logs\dns_PacketStatistic.csv
EXEMPLE 4
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputFile "C:\Output\parsed.csv"
Convertit le journal vers un emplacement de sortie personnalisé.
Sortie : C:\Output\parsed.csv
EXEMPLE 5
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -Delimiter "," -ComputerName "DNS01" -OutputType Both
Convertit avec délimiteur virgule et ajoute la colonne ComputerName avec la valeur “DNS01”.
Sortie :
- C:\Logs\dns.csv
- C:\Logs\dns_Statistic.csv
- C:\Logs\dns_PacketStatistic.csv
EXEMPLE 6
PS C:\> Get-ChildItem "C:\Logs\*.log" | Convert-DNSDebugLogFile -OutputType Both
Traitement par lots de plusieurs fichiers journaux DNS via pipeline.
Sortie : Pour chaque fichier .log, génère des fichiers .csv et _statistic.csv
EXEMPLE 7
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput
Convertit et compresse la sortie en archive ZIP.
Sortie : C:\Logs\dns.zip (contenant dns.csv + fichiers statistiques)
EXEMPLE 8
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -RemoveSourceFile -Verbose
Convertit le journal et supprime le fichier source après traitement réussi.
La sortie détaillée confirme la suppression du fichier.
EXEMPLE 9
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -InputCulture 'de-DE' -OutputCulture 'en-US'
Analyse le format de date allemand (JJ.MM.AAAA) et produit en format US (MM/JJ/AAAA).
À utiliser lors du traitement de journaux provenant de serveurs avec des paramètres régionaux différents.
EXEMPLE 10
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter 'Packet'
Convertit uniquement les entrées de paquets de requêtes/réponses DNS, excluant les entrées EVENT et Note.
Utile pour se concentrer sur le trafic DNS réel.
EXEMPLE 11
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter 'Packet','Event'
Convertit à la fois les paquets DNS et les événements serveur, excluant Note et autres entrées.
Utile pour analyser le trafic DNS avec le contexte des événements serveur.
EXEMPLE 12
PS C:\> Get-ChildItem "C:\Logs\*.log" | Convert-DNSDebugLogFile -RemoveSourceFile -CompressOutput
Archivage automatique des journaux : traite tous les journaux, compresse la sortie et supprime les fichiers sources.
Idéal pour les pipelines de traitement de journaux planifiés.
EXEMPLE 13
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\large-dns.log" -NoDetailsParsing
Traite un gros fichier journal avec l’analyse des détails désactivée pour une performance maximale.
Les blocs de détails PACKET sont ignorés, la colonne Details reste vide.
À utiliser pour les très gros fichiers quand la structure détaillée des paquets n’est pas nécessaire.
PARAMÈTRES
-CompressOutput
Compresse les fichiers CSV de sortie dans une archive ZIP après création.
Crée un fichier .zip contenant les fichiers CSV générés, puis supprime les CSV non compressés.
Le fichier ZIP est créé dans le même répertoire que le CSV de sortie avec le même nom de base.
Avantages :
- Réduit significativement l’espace disque (les fichiers CSV se compressent généralement à plus de 90 %)
- Simplifie la gestion et l’archivage des fichiers
- Adapté au stockage à long terme
Exemple : Le fichier ‘dns.log’ génère ‘dns.csv’ compressé en ‘dns.zip’, puis ‘dns.csv’ est supprimé.
Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-ComputerName
Spécifie la valeur de la colonne ComputerName dans la sortie CSV.
La colonne ComputerName est
toujours présente dans la sortie - si ce paramètre n’est pas spécifié, la colonne sera vide.
Utilisez-le lors de la consolidation de journaux de plusieurs serveurs DNS pour identifier le serveur source dans
les ensembles de données combinés.
Note : Ce n’est PAS un paramètre de télécommande.
Il sert uniquement à étiqueter la sortie.
Si vous indiquez -InputFile vers
un chemin UNC, le fichier est lu depuis ce chemin (aucune exécution distante WinRM n’est effectuée).
Type: String
DefaultValue: ''
SupportsWildcards: false
Aliases:
- Server
- DNSServer
- HostName
ParameterSets:
- Name: (All)
Position: 3
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-Confirm
Vous invite à confirmer avant d’exécuter la cmdlet.
Si spécifié, demande confirmation avant :
- Le traitement de chaque fichier journal de débogage DNS
- La suppression des fichiers sources (lorsque -RemoveSourceFile est spécifié)
- L’écrasement des fichiers de sortie existants
Utile pour un traitement interactif lorsque vous souhaitez contrôler les fichiers traités.
Type: SwitchParameter
DefaultValue: ''
SupportsWildcards: false
Aliases:
- cf
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-ContextFilter
Filtre les types d’entrées du journal à inclure dans la sortie.
Accepte une ou plusieurs valeurs.
Les journaux de débogage DNS contiennent différents types de contexte :
- PACKET : Informations sur les paquets de requêtes et réponses DNS (données principales)
- EVENT : Événements du serveur DNS (ex. : « Le serveur DNS a démarré. »)
- Note : Notes et avertissements diagnostiques (ex. : erreurs de socket, états internes)
- DSPoll, Init, Lookup, Recurse, Remote, Tombstone : Types de contexte supplémentaires
Valeurs valides :
- ‘All’ : Inclut tous les types de contexte (par défaut)
- ‘Packet’ : Inclut uniquement les entrées PACKET (requêtes/réponses DNS)
- ‘Event’ : Inclut uniquement les entrées EVENT (événements serveur)
- ‘Note’ : Inclut uniquement les entrées Note (informations diagnostiques)
- Toute combinaison : Spécifiez plusieurs valeurs pour inclure des types de contexte spécifiques
Par défaut : All
Exemples :
- ‘Packet’ filtre uniquement le trafic DNS
- ‘Packet’,‘Event’ inclut à la fois le trafic DNS et les événements serveur
- ‘Note’,‘Event’ inclut les notes diagnostiques et les événements serveur
Note : En filtrant sur ‘Event’ ou ‘Note’, seules les colonnes DateTime, ThreadId, Context et Information
contiendront des données.
Les autres colonnes (Protocol, ClientIP, etc.) seront vides.
Type: String[]
DefaultValue: "@('All')"
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: 5
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-Delimiter
Spécifie le caractère délimiteur pour la sortie CSV.
Par défaut : point-virgule (;)
Alternatives courantes : virgule (,), tabulation (`t), barre verticale (|)
Utilisez le point-virgule dans les régions où la virgule est le séparateur décimal (Europe).
Utilisez la virgule pour les outils CSV standard et bases de données qui attendent des valeurs séparées par des virgules.
Type: String
DefaultValue: ;
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: 2
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
Spécifie la culture/locale à utiliser pour analyser les valeurs date/heure dans le journal de débogage DNS.
Les journaux de débogage DNS utilisent le format de date de la locale Windows du serveur où le journal
a été généré.
Utilisez ce paramètre lors du traitement de journaux provenant de serveurs avec des paramètres régionaux différents.
Par défaut : culture actuelle
Exemples courants :
- ‘de-DE’ ou ‘de-AT’ : format allemand (JJ.MM.AAAA ou JJ/MM/AAAA)
- ’en-US’ : format US (MM/JJ/AAAA avec AM/PM)
- ’en-GB’ : format UK (JJ/MM/AAAA avec heure 24h)
- ‘sv-SE’ : format suédois/ISO (AAAA-MM-JJ)
Type: CultureInfo
DefaultValue: '[System.Globalization.CultureInfo]::CurrentCulture'
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: 6
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
Spécifie le chemin vers le fichier journal de débogage DNS à analyser.
Supporte les tableaux pour traiter plusieurs fichiers.
Accepte l’entrée du pipeline depuis Get-ChildItem ou autres cmdlets produisant des fichiers.
Type: String[]
DefaultValue: ''
SupportsWildcards: false
Aliases:
- FullName
- FilePath
- InputPath
- File
- Path
ParameterSets:
- Name: (All)
Position: 0
IsRequired: true
ValueFromPipeline: true
ValueFromPipelineByPropertyName: true
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-NoDetailsParsing
Ignore l’analyse des blocs de détails PACKET en format JSON structuré.
Si spécifié, les enregistrements PACKET avec blocs de détails auront la ligne d’info TCP/UDP dans la colonne Information, mais la colonne Details restera vide.
Cela améliore significativement
la performance de traitement pour les gros fichiers journaux quand l’analyse détaillée des paquets n’est pas nécessaire.
Utilisez ce commutateur lorsque :
- Vous traitez des fichiers journaux très volumineux (100 Mo+) et n’avez besoin que des informations de requête basiques
- La structure détaillée (flags Message, sections DNS) n’est pas requise pour l’analyse
- La vitesse d’analyse prime sur la complétude des données
Impact sur la performance : Peut améliorer la vitesse de traitement de 30 à 50 % pour les journaux avec de nombreux blocs de détails PACKET.
Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-OutputCulture
Spécifie la culture/locale à utiliser pour formater les valeurs date/heure dans les fichiers CSV de sortie.
Contrôle la manière dont les valeurs DateTime sont écrites dans le CSV.
Utilisez-le lorsque les fichiers CSV seront consommés
par des applications ou systèmes avec des paramètres régionaux spécifiques.
Par défaut : culture actuelle
Exemples courants :
- ’en-US’ : format US (MM/JJ/AAAA)
- ‘de-DE’ : format allemand (JJ.MM.AAAA)
- ‘sv-SE’ ou InvariantCulture : format ISO (AAAA-MM-JJ) pour compatibilité maximale
Type: CultureInfo
DefaultValue: '[System.Globalization.CultureInfo]::CurrentCulture'
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: 7
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-OutputFile
Spécifie le chemin du fichier CSV de sortie.
Si non spécifié, utilise le nom du fichier d’entrée avec extension .csv
dans le même répertoire que le fichier d’entrée.
Important : Doit être un chemin de fichier, pas un répertoire.
Si vous souhaitez utiliser le répertoire du fichier d’entrée avec
un nom personnalisé, spécifiez le chemin complet incluant le nom de fichier.
Type: String
DefaultValue: ''
SupportsWildcards: false
Aliases:
- Output
- Destination
- OutFile
- OutputPath
ParameterSets:
- Name: (All)
Position: 1
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-OutputType
Spécifie le type de sortie à générer.
Valeurs valides :
- ‘CSV’ : Génère uniquement le fichier de données avec toutes les entrées analysées
- ‘Statistic’ : Génère uniquement les fichiers statistiques avec métriques agrégées
- ‘Both’ : Génère à la fois les fichiers de données et statistiques (par défaut)
Par défaut : Both
Lorsque les statistiques sont générées, deux fichiers distincts sont créés :
- ‘_Statistic.csv’ : Comptages résumés par type de contexte et par jour (Date, Context, Count, ComputerName)
- ‘_PacketStatistic.csv’ : Comptages détaillés PACKET par jour selon IP client, protocole, direction,
et type de requête (Date, ClientIP, Protocol, Direction, QuestionType, Count, ComputerName)
Type: String
DefaultValue: Both
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: 4
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-RemoveSourceFile
Supprime le fichier journal de débogage DNS source après un traitement réussi.
Utilisez ceci pour les pipelines automatisés de traitement de journaux ou la gestion d’espace disque.
Le fichier source est
supprimé uniquement si le traitement se termine avec succès et que tous les fichiers de sortie sont créés.
Sécurité : Ne peut pas être utilisé avec -SkipHeaderValidation pour éviter la suppression accidentelle de fichiers invalides.
Avertissement : Les fichiers sources sont supprimés définitivement.
Assurez-vous que les fichiers de sortie sont valides avant d’utiliser cette option.
Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
Ignore la validation de l’en-tête du journal de débogage DNS.
Par défaut, la cmdlet vérifie que les fichiers d’entrée ont un en-tête valide de journal de débogage DNS Server.
Utilisez ce commutateur pour traiter des fichiers sans validation, ce qui peut être utile pour :
- Formats de journaux modifiés ou personnalisés
- Dépannage de problèmes de validation
- Journaux non standard ou pré-traités
Avertissement : Peut entraîner des erreurs de traitement si le fichier n’est pas un journal DNS valide.
Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-WhatIf
Montre ce qui se passerait si la cmdlet était exécutée.
La cmdlet n’est pas exécutée.
Si spécifié, affiche des informations détaillées sur les opérations qui seraient effectuées
sans les exécuter réellement.
Utile pour :
- Prévisualiser les fichiers qui seraient traités
- Vérifier les chemins des fichiers de sortie avant traitement
- Tester les scripts avant exécution en production
Type: SwitchParameter
DefaultValue: ''
SupportsWildcards: false
Aliases:
- wi
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
CommonParameters
Cette cmdlet prend en charge les paramètres communs : -Debug, -ErrorAction, -ErrorVariable,
-InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable,
-ProgressAction, -Verbose, -WarningAction, et -WarningVariable. Pour plus d’informations, voir
about_CommonParameters.
System.String[]
NOTES
Version : 1.7.2.1
Auteur : Andi Bellstedt, Copilot, Patrick Charbonnier (Silent Waters IT Consulting S.L.)
Date : 2026-07-24
Mots-clés : Microsoft Windows Server, DNSServer, DNS, DebugLog, LogParser
9 - Exemples d'utilisation
Ici, vous trouverez des exemples pratiques d’utilisation du module dans des scénarios réels. Ces exemples sont conçus pour vous aider à comprendre comment appliquer les fonctionnalités du module.
Voici des exemples un peu plus approfondis et contextuels. Si vous souhaitez uniquement l’utilisation des commandes du module, consultez la référence des commandes.
9.1 - Flux de travail d'analyse de sécurité avec SQL Server
Convertissez les journaux de débogage DNS en CSV avec DNSServer.DebugLogParser, importez le résultat dans SQL Server, et exécutez une requête simple pour détecter une activité suspecte sur les enregistrements TXT.
Cet exemple montre un flux de travail pratique pour l’analyse de sécurité : analyser un journal de débogage DNS avec Convert-DNSDebugLogFile, importer le CSV généré dans SQL Server, et exécuter une requête qui met en évidence des volumes anormalement élevés de requêtes sur les enregistrements TXT.
Pour une meilleure interopérabilité, cet exemple écrit les horodatages dans un format proche de l’ISO en utilisant -OutputCulture 'sv-SE'.
Modules requis
Cet exemple utilise les modules PowerShell suivants :
DNSServer.DebugLogParserSqlServer
Installe-les si besoin :
Install-Module -Name DNSServer.DebugLogParser -Scope CurrentUser
Install-Module -Name SqlServer -Scope CurrentUser
Scénario
Utilise ce flux de travail lorsque tu souhaites transférer les données analysées d’un journal de débogage DNS dans SQL Server afin de pouvoir :
- rechercher efficacement dans de grands ensembles de données
- créer des requêtes de détection répétables
- corréler l’activité entre plusieurs serveurs DNS
- conserver des données normalisées pour des investigations ultérieures
Résultat de l’étape de conversion
Convert-DNSDebugLogFile n’écrit pas directement dans SQL Server. Il crée d’abord un fichier CSV. Ce fichier CSV est le jeu de données importé dans la base.
Dans cet exemple :
- journal d’entrée :
C:\Administration\Logs\DNS\dns.log - CSV généré :
C:\Administration\Logs\DNS\dns.csv - table cible :
dbo.DNSQueries
Créer la table cible
Exécute la commande suivante une fois dans SQL Server pour créer la table cible.
IF OBJECT_ID('dbo.DNSQueries', 'U') IS NULL
BEGIN
CREATE TABLE dbo.DNSQueries (
DateTime datetime2(0) NOT NULL,
ThreadId int NULL,
Context nvarchar(20) NULL,
PacketId int NULL,
Protocol nvarchar(10) NULL,
Direction nvarchar(10) NULL,
ClientIP nvarchar(64) NULL,
Xid nvarchar(16) NULL,
Type nvarchar(16) NULL,
Opcode nvarchar(16) NULL,
FlagsHex nvarchar(16) NULL,
FlagsChar nvarchar(16) NULL,
ResponseCode nvarchar(32) NULL,
QuestionType nvarchar(32) NULL,
QuestionName nvarchar(512) NULL,
Information nvarchar(max) NULL,
Details nvarchar(max) NULL,
ComputerName nvarchar(256) NULL
);
END;
Convertir le journal et importer le CSV
L’exemple PowerShell suivant réalise le flux complet :
- importe les modules requis
- convertit le journal de débogage DNS en CSV
- charge le CSV généré
- importe en masse les lignes dans SQL Server
# Requires -Modules DNSServer.DebugLogParser, SqlServer
Import-Module -Name DNSServer.DebugLogParser -ErrorAction Stop
Import-Module -Name SqlServer -ErrorAction Stop
$logPath = 'C:\Administration\Logs\DNS\dns.log'
$csvPath = 'C:\Administration\Logs\DNS\dns.csv'
$serverInstance = 'SQLServer'
$databaseName = 'DNSLogs'
$delimiter = ';'
$createTableSql = @'
IF OBJECT_ID('dbo.DNSQueries', 'U') IS NULL
BEGIN
CREATE TABLE dbo.DNSQueries (
DateTime datetime2(0) NOT NULL,
ThreadId int NULL,
Context nvarchar(20) NULL,
PacketId int NULL,
Protocol nvarchar(10) NULL,
Direction nvarchar(10) NULL,
ClientIP nvarchar(64) NULL,
Xid nvarchar(16) NULL,
Type nvarchar(16) NULL,
Opcode nvarchar(16) NULL,
FlagsHex nvarchar(16) NULL,
FlagsChar nvarchar(16) NULL,
ResponseCode nvarchar(32) NULL,
QuestionType nvarchar(32) NULL,
QuestionName nvarchar(512) NULL,
Information nvarchar(max) NULL,
Details nvarchar(max) NULL,
ComputerName nvarchar(256) NULL
);
END
'@
Convert-DNSDebugLogFile `
-InputFile $logPath `
-ComputerName 'DNS01' `
-OutputType CSV `
-OutputFile $csvPath `
-Delimiter $delimiter `
-OutputCulture 'sv-SE'
$rows = Import-Csv -Path $csvPath -Delimiter $delimiter
if (-not $rows) {
throw "Le fichier CSV généré '$csvPath' ne contient aucune ligne."
}
$dataTable = [System.Data.DataTable]::new()
foreach ($columnName in $rows[0].PSObject.Properties.Name) {
$null = $dataTable.Columns.Add($columnName, [string])
}
foreach ($row in $rows) {
$dataRow = $dataTable.NewRow()
foreach ($column in $dataTable.Columns) {
$columnName = $column.ColumnName
$dataRow[$columnName] = $row.$columnName
}
$null = $dataTable.Rows.Add($dataRow)
}
$connectionString = "Server=$serverInstance;Database=$databaseName;Integrated Security=True"
$connection = [System.Data.SqlClient.SqlConnection]::new($connectionString)
try {
$connection.Open()
$command = $connection.CreateCommand()
$command.CommandText = $createTableSql
$null = $command.ExecuteNonQuery()
$bulkCopy = [System.Data.SqlClient.SqlBulkCopy]::new($connection)
$bulkCopy.DestinationTableName = 'dbo.DNSQueries'
foreach ($column in $dataTable.Columns) {
$null = $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName)
}
$bulkCopy.WriteToServer($dataTable)
}
finally {
$connection.Dispose()
}
Requête pour détecter une activité suspecte sur les enregistrements TXT
Une fois les données dans SQL Server, tu peux rechercher les clients qui émettent un nombre anormalement élevé de requêtes sur les enregistrements TXT.
SELECT
ComputerName,
ClientIP,
QuestionName,
COUNT(*) AS QueryCount
FROM dbo.DNSQueries
WHERE QuestionType = 'TXT'
GROUP BY
ComputerName,
ClientIP,
QuestionName
HAVING COUNT(*) > 100
ORDER BY QueryCount DESC;
Si tu préfères exécuter la requête depuis PowerShell, utilise Invoke-Sqlcmd du module SqlServer :
$query = @'
SELECT
ComputerName,
ClientIP,
QuestionName,
COUNT(*) AS QueryCount
FROM dbo.DNSQueries
WHERE QuestionType = 'TXT'
GROUP BY
ComputerName,
ClientIP,
QuestionName
HAVING COUNT(*) > 100
ORDER BY QueryCount DESC;
'@
Invoke-Sqlcmd `
-ServerInstance 'SQLServer' `
-Database 'DNSLogs' `
-Query $query
Pourquoi les requêtes TXT sont intéressantes
Un volume élevé de requêtes sur les enregistrements TXT peut valoir la peine d’être examiné car cela peut indiquer :
- un tunnel DNS
- une exfiltration de données via DNS
- un abus des enregistrements TXT par des malwares ou des outils
- des clients anormalement bruyants ou mal configurés
Cette requête n’est qu’un point de départ. En production, tu devrais ajuster le seuil et ajouter des filtres adaptés à ton environnement.
Notes opérationnelles
Import-Csv charge le fichier complet en mémoire. Pour des exports de journaux très volumineux, envisage une approche en streaming plutôt que de construire un DataTable complet.- Garde
-ComputerName dans l’étape de conversion pour que les enregistrements restent attribuables après ingestion centralisée. - Utilise un délimiteur et une culture cohérents lors de l’export et de l’import.
- Vérifie la rétention, l’indexation et le contrôle d’accès dans SQL Server avant d’utiliser ce flux pour un stockage à long terme.
9.2 - Utilisation pratique dans un environnement de domaine (collection et conversion pilotées par GPO)
Cet exemple montre comment mettre en œuvre un flux de travail piloté par GPO pour collecter et convertir les journaux de débogage DNS sur les contrôleurs de domaine.
Ce document présente un exemple pratique complet d’exécution de DNSServer.DebugLogParser dans un environnement de domaine Active Directory, axé sur la conversion des journaux de débogage du serveur DNS Windows sur les contrôleurs de domaine.
Cet exemple est accompagné d’une archive ZIP, qui fournit les artefacts de stratégie utilisés pour mettre en œuvre le flux de travail décrit ici.
Les artefacts les plus pertinents sont le manifest de sauvegarde, le rapport GPO, le Files.xml, le Set-DNSServerDebugLogging.ps1, et le ScheduledTasks.xml.
Scénario
- Plusieurs contrôleurs de domaine (DC) hébergent le rôle de serveur DNS.
- Le journal de débogage DNS est activé et configuré de manière cohérente sur chaque DC via une tâche planifiée (écriture des fichiers journaux dans
C:\Administration\Logs\DNSServer). - Un processus centralisé convertit les journaux en CSV pour :
- l’analyse de sécurité
- le reporting opérationnel
- le dépannage
- la conformité / conservation
Résultats visés
- Paramètres de conversion cohérents sur tous les DC
- Emplacement et nommage des fichiers de sortie prévisibles
- Compression optionnelle pour réduire l’espace de stockage
- Sorties statistiques optionnelles pour des synthèses quotidiennes rapides
- Risque minimal côté hôte, avec des considérations explicites de relance et nettoyage
Architecture suggérée
Modèle de collecte : conversion locale + collecte centrale
- Chaque DC écrit les journaux de débogage DNS sur disque avec rotation activée.
- Chaque DC convertit les fichiers
*.log archivés en CSV de données et CSV statistiques, puis compresse les sorties en *.zip selon un planning (Planificateur de tâches). - Les sorties sont écrites à côté des fichiers journaux pour garder le pipeline simple.
- Un serveur central collecte les fichiers
*.zip, par exemple via ingestion de partage de fichiers, copie planifiée, forwarder SIEM ou collecteur basé agent.
Ce modèle minimise les lectures réseau de gros fichiers journaux bruts et maintient l’analyse proche des données.
Flux de travail GPO
Le flux de travail est mis en œuvre via la stratégie de groupe (configuration ordinateur) pour garantir des paramètres cohérents sur tous les contrôleurs de domaine.
Implémentation de référence incluse dans ce dépôt (rapport GPO) :
- Nom d’archive/rapport :
T0-C-Analytics-DNSDebugLogging - ID de sauvegarde :
{2B6F16BC-0E7C-4787-83D7-2854FED882EE} - Cible de lien GPO :
corp.company.com/Domain Controllers - Filtre d’élément (utilisé pour le déploiement des fichiers et les tâches planifiées) : s’applique uniquement si
C:\Windows\System32\dns.exe existe
1) Prérequis (dossiers + module)
La sauvegarde fournie suppose que ces dossiers existent déjà. Ajoutez des éléments GPP séparés si vous souhaitez que le déploiement les crée automatiquement :
C:\Administration\ScriptsC:\Administration\Logs\DNSServer
La sauvegarde fournie suppose également que Convert-DNSDebugLogFile est déjà disponible sur les DC. La tâche de conversion lance Windows PowerShell 5.1 avec -NoProfile et n’importe pas explicitement le module, donc celui-ci doit être installé dans un chemin de module PowerShell machine-wide visible par LocalSystem. Approches recommandées :
- Installer DNSServer.DebugLogParser sur les DC. Par exemple, depuis PowerShell Gallery (si la politique le permet).
- Déployer le module via un repo interne / partage de fichiers pour qu’il soit détectable dans
$env:PSModulePath - Ajouter un
Import-Module explicite à l’action de la tâche si vous souhaitez un chargement déterministe
2) Déployer le script de configuration du journal de débogage (GPP Files)
La GPO déploie le script :
- Source (dans SYSVOL via GPP) :
%GptPath%\Preferences\Files\Set-DNSServerDebugLogging.ps1 - Cible (sur chaque DC) :
C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1
Cela est implémenté dans l’élément de préférence GPP Files dans Files.xml.
La GPO crée une tâche planifiée nommée Set-DNSServerDebugLogging.
- Contexte de sécurité dans la sauvegarde fournie :
SYSTEM avec type de connexion S4U - Déclencheur dans la sauvegarde fournie : quotidien (heure de début
2025-03-01T00:00:01) - Action dans ScheduledTasks.xml :
powershell.exe -ExecutionPolicy RemoteSigned -command " & { C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1 }"- Répertoire de travail :
C:\Administration\Scripts
Le script Set-DNSServerDebugLogging.ps1 configure le journal de débogage DNS via Get-DnsServerDiagnostics / Set-DnsServerDiagnostics et notamment :
- Active la journalisation dans un fichier + rotation
- Écrit dans :
C:\Administration\Logs\DNSServer\DnsDebugLog_<COMPUTERNAME>.<Domain>_.log - Utilise une taille de rotation de 10 Mo par fichier
- Capture principalement l’activité liée aux requêtes (requêtes + notifications + mises à jour + transactions de questions) et exclut la journalisation complète des paquets
4) Tâche planifiée : convertir les journaux de débogage archivés en CSV compressé
La GPO crée une tâche planifiée nommée Convert-DNSDebugLogs.
- Contexte de sécurité dans la sauvegarde fournie :
SYSTEM avec type de connexion InteractiveToken - Déclencheur dans la sauvegarde fournie : quotidien (heure de début
2026-01-01T00:30:00) - Répertoire de travail :
C:\Administration\Logs\DNSServer - Action dans ScheduledTasks.xml (formaté pour la lisibilité) :
Get-ChildItem .\*.log |
Sort-Object lastwritetime, Name -Descending |
Select-Object -Skip 1 |
Convert-DNSDebugLogFile `
-ComputerName $env:COMPUTERNAME `
-Delimiter ';' `
-OutputType Both `
-ContextFilter Packet `
-OutputCulture sv-SE `
-CompressOutput
Notes de conception :
Select-Object -Skip 1 évite intentionnellement de traiter le fichier journal le plus récent (actif). Convert-DNSDebugLogFile peut lire un journal que le serveur DNS a actuellement ouvert, mais ce fichier change pendant la lecture : la sortie peut manquer les entrées les plus récentes ou se terminer par un enregistrement tronqué, et deux exécutions ne produisent pas des résultats identiques. Ignorer le fichier actif maintient la sortie planifiée reproductible.- Cela signifie que les données actuelles ne sont exportées qu’après la rotation ; sur les DC à faible volume, le journal actif peut rester non traité plus d’un jour. Réduisez la taille de rotation si ce délai est trop long pour votre cas d’usage.
- Parce que Convert-DNSDebugLogFile utilise par défaut
-OutputFile « même dossier, même nom, .csv », les sorties se trouvent à côté des entrées *.log. - Avec
-CompressOutput, chaque journal traité produit un *.zip et les CSV intermédiaires sont supprimés. - À moins d’archiver ou supprimer les fichiers
*.log traités, les exécutions ultérieures retraiteront tous les journaux non actifs. - La tâche génère une erreur si
$Error.Count -gt 0 pour signaler un échec.
5) Ingestion centrale
Options (choisir une) :
- Ingestion via partage de fichiers : le DC écrit (ou copie)
C:\Administration\Logs\DNSServer\*.zip vers \\fileserver\share\dns\$env:COMPUTERNAME\... (accorder les droits de partage et NTFS aux comptes ordinateurs DC ou au groupe Domain Controllers si la tâche s’exécute en SYSTEM) - Modèle pull : un job central lit
\\dc\C$\Administration\Logs\DNSServer\*.zip (moins recommandé ; nécessite les partages admin) - Forwarder agent : pipeline SIEM / journal qui expédie les sorties
*.zip
Considérations opérationnelles
- Moindre privilège : les tâches s’exécutent en
SYSTEM ; assurez-vous que les dossiers locaux sont accessibles en écriture et que toute cible UNC accorde l’accès au compte ordinateur si utilisée. - Politique de signature : les deux tâches utilisent
-ExecutionPolicy RemoteSigned ; signez ou débloquez le script et le module déployés selon votre politique. - Utilisation disque :
-CompressOutput aide significativement, mais ce flux ne supprime pas les journaux sources ; planifiez la conservation et le nettoyage. - Comportement de retraitement : sauf archivage ou suppression des journaux traités, la tâche de conversion retraitera chaque fichier
*.log non actif lors des exécutions ultérieures. C’est simple et robuste, mais cela peut écraser les sorties et créer des doublons en aval si votre collecteur ne déduplique pas. - Consolidation multi-DC :
-ComputerName $env:COMPUTERNAME est inclus pour que les jeux de données consolidés restent traçables. Notez que -ComputerName ne fait que marquer la sortie — il n’établit aucune connexion distante. - Partages réseau : Convert-DNSDebugLogFile peut lire les journaux sources depuis des chemins SMB/UNC, mais convertir localement et expédier les résultats compressés reste la meilleure pratique pour les gros journaux bruts. Si vous utilisez un chemin UNC, rappelez-vous qu’une tâche s’exécutant en
SYSTEM s’authentifie sur le réseau en tant que compte ordinateur et nécessite les droits de partage et NTFS. - Format de date :
-OutputCulture sv-SE est utilisé délibérément pour que les horodatages s’écrivent sous la forme 2026-01-20 23:00:16. Ce format est lu sans indication par SQL Server, Power BI et la plupart des outils d’import, indépendamment de la locale du DC qui a produit le journal. - Validation : la validation de l’en-tête reste activée car la tâche n’utilise pas
-SkipHeaderValidation (recommandé).
Valider et adapter (avec le ZIP)
Utilisez l’archive ZIP comme implémentation de référence, puis alignez les aspects suivants à votre environnement :
- Portée cible : quels DC / OU reçoivent la stratégie
- Identité d’exécution : confirmez que les deux tâches planifiées utilisent le type de connexion prévu (
S4U vs InteractiveToken) ou normalisez-les selon votre standard - Création des dossiers : décidez si
C:\Administration\Scripts et C:\Administration\Logs\DNSServer sont pré-créés ailleurs ou doivent être créés par des éléments GPP supplémentaires - Chemins : confirmez que
C:\Administration\Scripts et C:\Administration\Logs\DNSServer correspondent à vos standards - Conservation : décidez si vous conservez les journaux bruts et pour combien de temps (surtout si vous activez les options de nettoyage)
- Ingestion : confirmez où les sorties CSV/ZIP sont écrites et comment elles sont collectées centralement
Si vous souhaitez valider la configuration exacte de la GPO sans l’importer, les sources autoritaires dans ce dépôt sont :
9.3 - Exemple de tâche planifiée
Cet exemple montre comment créer une tâche planifiée Windows qui exécute un script PowerShell pour traiter quotidiennement les journaux de débogage DNS.
Ce script crée une tâche planifiée Windows qui s’exécute tous les jours à 2h00 du matin. Il importe le module et traite tous les fichiers journaux dans le dossier où le script est exécuté (dans cet exemple “C:\Administration\Logs\DNS”). Le processus compresse la sortie dans des fichiers ZIP et supprime les originaux pour maintenir la propreté.
$actionParams = @{
Execute = "powershell.exe"
Argument = '-ExecutionPolicy RemoteSigned -Command "Import-Module DNSServer.DebugLogParser; Get-ChildItem .\*.log | Sort-Object lastwritetime, Name -Descending | Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME -Delimiter \";\" -OutputType Both -ContextFilter Packet -OutputCulture sv-SE -CompressOutput"'
WorkingDirectory = "C:\Administration\Logs\DNS"
}
$Action = New-ScheduledTaskAction @actionParams
$Trigger = New-ScheduledTaskTrigger -Daily -At "2:00AM"
Register-ScheduledTask -TaskName "Process DNS Logs" -Action $Action -Trigger $Trigger -Description "Convert DNS debug logs to CSV daily"