Acerca de esta documentación

Este es el sitio oficial de documentación para DNSServer.DebugLogParser, un módulo de PowerShell que transforma los archivos de registro de depuración del servidor DNS de Windows en datos CSV estructurados y analizables.

Acerca del módulo

DNSServer.DebugLogParser nació de una necesidad real: los registros de depuración del servidor DNS de Windows son texto legible para humanos, pero no aptos para análisis o informes. Este módulo cierra esa brecha convirtiendo archivos de registro en bruto en un formato CSV estructurado que se integra con herramientas comunes como Excel, Power BI, bases de datos SQL y sistemas SIEM.

Principios clave de diseño:

  • Rendimiento primero — optimizado para archivos de más de 100MB usando E/S por streaming y operaciones con cadenas
  • Compatibilidad entre ediciones — soporta PowerShell Desktop (5.1+) y Core (7.x)
  • Listo para producción — incluye validación de encabezados, manejo de errores y compresión opcional
  • Amigable con pipeline — se integra naturalmente con la arquitectura de pipeline de PowerShell

Recursos

Contribuciones

Las contribuciones son bienvenidas. Si encuentras problemas, errores o tienes sugerencias para mejoras, por favor abre un issue o pull request en el repositorio de GitHub.

1 - Descripción general

DNSServer.DebugLogParser es un módulo de PowerShell que transforma los archivos de registro de depuración del servidor DNS de Windows en datos CSV estructurados y analizables para análisis de seguridad, monitoreo de rendimiento, solución de problemas e informes de cumplimiento.

¿Qué es un registro de depuración DNS?

El registro de depuración DNS es una función del servidor DNS de Windows que registra información detallada sobre las operaciones DNS. Cuando está habilitado, el servidor DNS escribe entradas de registro en un archivo de texto (normalmente dns.log) en el directorio del servidor DNS.

Cada entrada de registro contiene hasta 16 campos, incluyendo:

  • Fecha y hora de la consulta
  • Protocolo usado (UDP o TCP)
  • Dirección (Envió o Recibió)
  • Dirección IP del cliente
  • Tipo de consulta (A, AAAA, MX, PTR, etc.)
  • Nombre de dominio consultado
  • Código de respuesta (NOERROR, NXDOMAIN, etc.)
  • Banderas y opciones de consulta
  • Dirección IP en la respuesta (para consultas exitosas)
  • Números de puerto y detalles técnicos adicionales

¿Por qué analizar los registros de depuración DNS?

Los registros DNS son críticos para:

Solución de problemas

  • Diagnosticar fallos en la resolución de nombres
  • Identificar clientes o aplicaciones mal configuradas
  • Rastrear la fuente de consultas problemáticas
  • Verificar la configuración correcta del DNS y las transferencias de zona

Monitoreo de rendimiento

  • Identificar fuentes de consultas de alto volumen
  • Analizar tipos y patrones de consulta para optimizar la infraestructura DNS
  • Detectar problemas de configuración que causan consultas excesivas
  • Rastrear tiempos de respuesta y tasas de éxito
  • Monitorear la carga y capacidad del servidor DNS

Análisis de seguridad

  • Detectar intentos de túneles DNS y exfiltración de datos
  • Identificar dominios asociados con malware y servidores de mando y control
  • Rastrear patrones de consulta sospechosos que pueden indicar sistemas comprometidos
  • Monitorear ataques de amplificación DNS
  • Investigar incidentes de seguridad y rastrear la actividad de atacantes

Cumplimiento y auditoría

  • Cumplir con requisitos regulatorios de registro y retención
  • Documentar la actividad de red para auditorías
  • Generar informes para gerencia y oficiales de cumplimiento
  • Demostrar diligencia debida en la supervisión de seguridad

Cómo funciona el módulo (a alto nivel)

El módulo está optimizado para archivos grandes y procesa registros de depuración DNS en una salida CSV estructurada. Soporta registros multilínea (por ejemplo, bloques de detalle PACKET y líneas de continuación indentadas) para que los mensajes de eventos/diagnósticos y detalles de paquetes se mantengan asociados al registro correcto.

Capacidades clave:

  • Analiza los campos nativos del registro de depuración DNS y produce un formato CSV consistente
  • Maneja múltiples versiones del servidor DNS (2012 R2 hasta 2025)
  • Soporta tanto PowerShell Desktop (5.1+) como Core (7.x)
  • Procesa archivos de cualquier tamaño (probado con archivos de más de 100MB)
  • Valida los encabezados del archivo de registro para asegurar la integridad de los datos
  • Genera resúmenes estadísticos opcionales
  • Soporta procesamiento por lotes vía pipeline de PowerShell
  • Comprime opcionalmente los archivos de salida para ahorrar espacio en disco
  • Puede eliminar automáticamente los archivos fuente tras un procesamiento exitoso
  • Análisis de fechas sensible a la cultura para registros DNS internacionales
  • Formateo de fechas sensible a la cultura para requisitos internacionales de salida

Licencia y soporte

El módulo se publica bajo la Licencia MIT. El soporte comunitario está disponible a través de Issues en GitHub.

2 - Formatos de salida

DNSServer.DebugLogParser puede generar dos tipos de salida:

  • Un archivo de datos CSV que contiene todas las entradas analizadas
  • Archivos de estadísticas opcionales para agregación diaria

Para ver ejemplos reales de cada tipo de salida, consulta la muestra en este artículo.

Archivo de datos CSV

Ejemplos de archivos de salida:

El archivo de datos CSV contiene todas las entradas de registro analizadas con las siguientes columnas:

  • DateTime: Fecha y hora de la consulta/respuesta DNS
  • ThreadId: Identificador interno del hilo del servidor DNS
  • Context: Contexto de la operación (por ejemplo Packet, Event, Note, DSPoll, Init, Lookup, Recurse, Remote, Tombstone)
  • PacketId: Identificador del paquete DNS
  • Protocol: UDP o TCP
  • Direction: Rcv (recibido/consulta) o Snd (enviado/respuesta)
  • ClientIP: Dirección IP del cliente
  • Xid: ID de transacción (hexadecimal)
  • Type: Consulta o Respuesta
  • Opcode: Standard, Notify, Update o Unknown
  • FlagsHex: Banderas de consulta/respuesta (hexadecimal)
  • FlagsChar: Banderas decodificadas (Authoritative, Truncated, RecursionDesired, RecursionAvailable)
  • ResponseCode: NOERROR, NXDOMAIN, SERVFAIL, etc.
  • QuestionType: Tipo de registro DNS (A, AAAA, MX, PTR, etc.)
  • QuestionName: Nombre de dominio consultado
  • Information: Información adicional (para Event/Note/etc.; para bloques de detalle de Paquete, contiene la línea de encabezado de detalle TCP/UDP)
  • Details: Datos JSON para entradas de Paquete que incluyen bloques de detalle (vacío en caso contrario)
  • ComputerName: Nombre del servidor origen (siempre presente; vacío si no se especifica)

Nota: La columna ComputerName siempre se incluye al final de cada registro para asegurar una estructura de salida consistente. Esto facilita escenarios de consolidación de registros de múltiples servidores.

Archivos de estadísticas (opcionales)

Ejemplos de archivos de salida:

Cuando se generan estadísticas, se crean dos archivos separados:

1) Estadísticas de contexto (*_Statistic.csv)

Columnas:

  • Date: Fecha (yyyy-MM-dd)
  • Context: Nombre del contexto (por ejemplo Packet, Event, Note)
  • Count: Número de registros
  • ComputerName: Nombre del servidor origen

2) Estadísticas de paquete (*_PacketStatistic.csv)

Columnas:

  • Date: Fecha (yyyy-MM-dd)
  • ClientIP: Dirección IP del cliente
  • Protocol: UDP o TCP
  • Direction: Rcv o Snd
  • QuestionType: Tipo de registro DNS
  • Count: Número de registros
  • ComputerName: Nombre del servidor origen

3 - Mejores Prácticas Operativas

Al usar DNSServer.DebugLogParser en producción:

  1. Programa el procesamiento regular

    • Usa el Programador de Tareas para convertir automáticamente los nuevos archivos de registro diariamente o semanalmente.
  2. Rota los registros adecuadamente

    • Los registros de depuración DNS pueden crecer rápido; configura la rotación a un tamaño manejable (por ejemplo, 100MB).
  3. Valida la salida

    • Verifica los primeros archivos convertidos antes de automatizar completamente.
  4. Planifica los requisitos de almacenamiento

    • Incluso con compresión, planifica el almacenamiento según el volumen de DNS y la retención.
  5. Protege los datos sensibles

    • Los registros DNS pueden ser sensibles; protege las salidas con controles de acceso adecuados.
  6. Documenta tu flujo de trabajo

    • Documenta los horarios de procesamiento, ubicaciones de almacenamiento y uso del análisis.
  7. Prueba con archivos de ejemplo

    • Valida los parámetros y el formato de salida antes de procesar registros críticos.
  8. Monitorea errores

    • Vigila registros corruptos, problemas de acceso o espacio insuficiente en disco.

4 - Solución de problemas

Problemas comunes y soluciones

“El archivo no es un archivo válido de registro de depuración DNS”

  • Asegúrate de que estás convirtiendo un registro de depuración de un servidor DNS real.
  • El archivo debería comenzar con Message logging started at o contener entradas de consultas DNS.
  • Si estás seguro de que el archivo es válido pero el encabezado es diferente, usa -SkipHeaderValidation.

El archivo de salida está vacío o incompleto

  • Confirma que el archivo de entrada contiene entradas de registro válidas.
  • Algunos registros pueden contener solo información del encabezado si no ocurrieron consultas.
  • Verifica que el archivo de registro no esté corrupto y contenga datos reales de consultas.

El procesamiento es muy lento

  • Asegúrate de tener suficiente memoria y que el disco no esté muy cargado.
  • Considera procesar archivos de registro más pequeños.
  • Considera usar -CompressOutput con procesamiento programado para manejar lotes más pequeños.

Errores de “Acceso denegado”

  • Ejecuta PowerShell con los permisos adecuados para leer los archivos de registro fuente y escribir en el directorio de destino.
  • Los archivos de registro DNS pueden requerir acceso de administrador.

La salida comprimida es más grande de lo esperado

  • Los registros con muchos valores únicos se comprimen menos eficientemente; esto puede ser normal.
  • La compresión ZIP generalmente sigue logrando una reducción sustancial.

El archivo de estadísticas no coincide con lo esperado

  • Verifica que estés usando -OutputType Both o -OutputType Statistic.
  • Las estadísticas son recuentos agregados (agrupaciones diarias), por lo que los valores representan totales.

Reportar problemas

Si encuentras problemas que no se cubren aquí:

  1. Verifica que estés usando la versión más reciente del módulo.
  2. Revisa los Issues en GitHub para problemas similares.
  3. Recopila información diagnóstica:
    • Versión de PowerShell ($PSVersionTable)
    • Versión del módulo (Get-Module DNSServer.DebugLogParser)
    • Archivo de registro de muestra (si es posible)
    • Mensaje completo de error y traza de pila
  4. Abre un nuevo Issue en GitHub con los detalles.

5 - Referencia de comandos del módulo

Aquí puedes encontrar una referencia para todos los comandos del módulo. Esta referencia está diseñada para ayudarte a encontrar rápidamente el comando que necesitas y entender cómo usarlo de manera efectiva.

Al hacer clic en un comando, serás llevado a una página detallada que proporciona información completa sobre el comando, incluyendo su sintaxis, parámetros, ejemplos y cualquier nota o consejo adicional para su uso.

5.1 - Convert-DNSDebugLogFile

SINOPSIS

Transforma los registros de depuración del servidor DNS de Windows en un formato CSV estructurado para análisis e informes.

SINTAXIS

__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] [<CommonParameters>]

ALIAS

Este cmdlet tiene los siguientes alias,

DESCRIPCIÓN

Convierte archivos de registro de depuración del servidor DNS de Windows en datos CSV estructurados que pueden analizarse en Excel, Power BI, bases de datos SQL o herramientas SIEM. Diseñado para análisis de seguridad, monitoreo de rendimiento, solución de problemas e informes de cumplimiento.

El cmdlet analiza los registros de depuración DNS y escribe una salida CSV consistente para análisis. La salida CSV contiene 18 columnas, incluyendo una columna Information para texto de eventos/diagnósticos, una columna JSON opcional Details para bloques de detalles de paquetes, y una columna ComputerName siempre presente (vacía a menos que se especifique).

CARACTERÍSTICAS PRINCIPALES:

  • Análisis de alto rendimiento optimizado para archivos grandes (más de 100MB)
  • Delimitador CSV personalizable (por defecto: punto y coma)
  • Resúmenes estadísticos opcionales con métricas agregadas
  • Filtrado por contexto (Paquete, Evento, Nota y contextos adicionales) para enfocarse en tipos específicos de entradas de registro
  • Análisis y formato de fechas sensibles a la cultura para servidores internacionales
  • Soporte para canalización para procesamiento por lotes de múltiples archivos
  • Compresión opcional de archivos de salida (formato ZIP)
  • Eliminación automática opcional de archivos fuente tras el procesamiento
  • Validación de encabezados para asegurar la integridad de los datos

FORMATO DE SALIDA: La columna ComputerName siempre se incluye al final de cada registro. Si no se especifica el parámetro -ComputerName, la columna estará vacía. Esto asegura una estructura de salida consistente para escenarios de consolidación de múltiples servidores.

RENDIMIENTO: Optimizado usando StreamReader/StreamWriter con buffers de 64KB, operaciones con cadenas en lugar de expresiones regulares, generación manual de CSV y recolección eficiente de estadísticas basada en tablas hash.

COMPATIBILIDAD:

  • PowerShell 5.1+ (ediciones Desktop y Core)
  • Windows Server 2016+
  • Formatos de registro de DNS Server desde 2012 R2 hasta 2025

EJEMPLOS

EJEMPLO 1

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log"

Convierte el registro de depuración DNS usando la configuración por defecto (archivos de datos y estadísticas con delimitador punto y coma).
Salida:

  • C:\Logs\dns.csv
  • C:\Logs\dns_Statistic.csv
  • C:\Logs\dns_PacketStatistic.csv

EJEMPLO 2

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputType CSV

Genera solo el archivo de datos sin estadísticas.
Salida: C:\Logs\dns.csv

EJEMPLO 3

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputType Statistic

Genera solo los archivos de estadísticas con métricas agregadas.
Salida:

  • C:\Logs\dns_Statistic.csv
  • C:\Logs\dns_PacketStatistic.csv

EJEMPLO 4

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputFile "C:\Output\parsed.csv"

Convierte el registro a una ubicación de salida personalizada.
Salida: C:\Output\parsed.csv

EJEMPLO 5

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -Delimiter "," -ComputerName "DNS01" -OutputType Both

Convierte con delimitador coma y añade la columna ComputerName con el valor “DNS01”.
Salida:

  • C:\Logs\dns.csv
  • C:\Logs\dns_Statistic.csv
  • C:\Logs\dns_PacketStatistic.csv

EJEMPLO 6

PS C:\> Get-ChildItem "C:\Logs\*.log" | Convert-DNSDebugLogFile -OutputType Both

Procesa por lotes múltiples archivos de registro de depuración DNS mediante canalización.
Salida: Para cada archivo .log, genera archivos .csv y _statistic.csv

EJEMPLO 7

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput

Convierte y comprime la salida en un archivo ZIP.
Salida: C:\Logs\dns.zip (contiene dns.csv + archivos de estadísticas)

EJEMPLO 8

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -RemoveSourceFile -Verbose

Convierte el registro y elimina el archivo fuente tras un procesamiento exitoso.
La salida detallada confirma la eliminación del archivo.

EJEMPLO 9

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -InputCulture 'de-DE' -OutputCulture 'en-US'

Analiza el formato de fecha alemán (DD.MM.AAAA) y lo convierte al formato estadounidense (MM/DD/AAAA).
Útil para procesar registros de servidores con configuraciones regionales diferentes.

EJEMPLO 10

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter 'Packet'

Convierte solo las entradas de paquetes de consulta/respuesta DNS, excluyendo entradas EVENT y Note.
Útil para enfocar el análisis en el tráfico DNS real.

EJEMPLO 11

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter 'Packet','Event'

Convierte tanto paquetes de consulta/respuesta DNS como eventos del servidor, excluyendo Note y otras entradas.
Útil para analizar el tráfico DNS junto con el contexto de eventos del servidor.

EJEMPLO 12

PS C:\> Get-ChildItem "C:\Logs\*.log" | Convert-DNSDebugLogFile -RemoveSourceFile -CompressOutput

Archivado automático de registros: procesa todos los registros, comprime la salida y elimina los archivos fuente.
Ideal para pipelines programados de procesamiento de registros.

EJEMPLO 13

PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\large-dns.log" -NoDetailsParsing

Procesa un archivo de registro grande con el análisis de detalles deshabilitado para máximo rendimiento.
Los bloques de detalle PACKET se omiten, manteniendo la columna Details vacía.
Útil cuando se procesan archivos muy grandes y no se necesita el análisis detallado de la estructura de paquetes.

PARÁMETROS

-CompressOutput

Comprime los archivos CSV de salida en un archivo ZIP tras la creación.

Crea un archivo .zip que contiene los archivos CSV generados y luego elimina los CSV sin comprimir.
El archivo ZIP se crea en el mismo directorio que el CSV de salida con el mismo nombre base.

Beneficios:

  • Reduce significativamente el espacio en disco (los archivos CSV suelen comprimirse más del 90%)
  • Simplifica la gestión y archivado de archivos
  • Adecuado para almacenamiento a largo plazo

Ejemplo: El archivo ‘dns.log’ genera ‘dns.csv’ comprimido a ‘dns.zip’, luego se elimina ‘dns.csv’.

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

Especifica el valor para la columna ComputerName en la salida CSV.
La columna ComputerName siempre está presente en la salida; si no se especifica este parámetro, la columna estará vacía.

Úsalo cuando consolides registros de múltiples servidores DNS para identificar el servidor origen en conjuntos de datos combinados.

Nota: Este NO es un parámetro de remoting.
El cmdlet procesa solo archivos locales.

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

Solicita confirmación antes de ejecutar el cmdlet.

Cuando se especifica, solicita confirmación antes de:

  • Procesar cada archivo de registro de depuración DNS
  • Eliminar archivos fuente (cuando se especifica -RemoveSourceFile)
  • Sobrescribir archivos de salida existentes

Útil para procesamiento interactivo cuando quieres controlar qué archivos se procesan.

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

Filtra qué tipos de entradas de registro incluir en la salida.
Acepta uno o múltiples valores.

Los registros de depuración DNS contienen diferentes tipos de contexto:

  • PACKET: Información de paquetes de consulta y respuesta DNS (datos principales)
  • EVENT: Eventos del servidor DNS (por ejemplo, “El servidor DNS ha iniciado.”)
  • Note: Notas y advertencias diagnósticas (por ejemplo, errores de socket, estados internos)
  • DSPoll, Init, Lookup, Recurse, Remote, Tombstone: Tipos de contexto adicionales

Valores válidos:

  • ‘All’: Incluye todos los tipos de contexto (por defecto)
  • ‘Packet’: Incluye solo entradas PACKET (consultas/respuestas DNS)
  • ‘Event’: Incluye solo entradas EVENT (eventos del servidor)
  • ‘Note’: Incluye solo entradas Note (información diagnóstica)
  • Cualquier combinación: Especifica múltiples valores para incluir tipos de contexto específicos

Por defecto: All

Ejemplos:

  • ‘Packet’ filtra solo tráfico DNS
  • ‘Packet’,‘Event’ incluye tráfico DNS y eventos del servidor
  • ‘Note’,‘Event’ incluye notas diagnósticas y eventos del servidor

Nota: Al filtrar por ‘Event’ o ‘Note’, solo las columnas DateTime, ThreadId, Context e Information contendrán datos.
Las demás columnas (Protocol, ClientIP, etc.) estarán vacías.

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

Especifica el carácter delimitador para la salida CSV.

Por defecto: Punto y coma (;)

Alternativas comunes: Coma (,), Tabulación (`t), Barra vertical (|)

Usa punto y coma en regiones donde la coma es el separador decimal (Europa).
Usa coma para herramientas CSV estándar y bases de datos que esperan valores separados por coma.

Type: String
DefaultValue: ;
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 2
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-InputCulture

Especifica la cultura/locale para analizar valores de fecha/hora en el registro de depuración DNS.

Los registros de depuración del servidor DNS usan el formato de fecha de la configuración regional de Windows en el servidor donde se generó el registro.
Usa este parámetro cuando proceses registros de servidores con configuraciones regionales diferentes.

Por defecto: Cultura actual

Ejemplos comunes:

  • ‘de-DE’ o ‘de-AT’: Formato alemán (DD.MM.AAAA o DD/MM/AAAA)
  • ’en-US’: Formato estadounidense (MM/DD/AAAA con AM/PM)
  • ’en-GB’: Formato británico (DD/MM/AAAA con hora 24h)
  • ‘sv-SE’: Formato sueco/ISO (AAAA-MM-DD)
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: ''

-InputFile

Especifica la ruta del archivo de registro de depuración DNS a analizar.
Soporta arreglos para procesar múltiples archivos.

Acepta entrada por canalización desde Get-ChildItem u otros cmdlets que produzcan archivos.

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

Omite el análisis de los bloques de detalle PACKET en formato JSON estructurado.

Cuando se especifica, los registros PACKET con bloques de detalle tendrán la línea de información TCP/UDP en la columna Information, pero la columna Details permanecerá vacía.
Esto mejora significativamente el rendimiento del procesamiento para archivos grandes cuando no se requiere análisis detallado de la estructura de paquetes.

Usa este interruptor cuando:

  • Proceses archivos muy grandes (más de 100MB) y solo necesites información básica de consultas
  • No se requiera la estructura detallada (banderas de mensaje, secciones DNS) para el análisis
  • Priorices la velocidad de análisis sobre la completitud de datos

Impacto en rendimiento: Puede mejorar la velocidad de procesamiento entre 30-50% para registros con muchos bloques de detalle 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

Especifica la cultura/locale para formatear valores de fecha/hora en los archivos CSV de salida.

Controla cómo se escriben los valores DateTime en el CSV.
Úsalo cuando los archivos CSV serán consumidos por aplicaciones o sistemas con configuraciones regionales específicas.

Por defecto: Cultura actual

Ejemplos comunes:

  • ’en-US’: Formato estadounidense (MM/DD/AAAA)
  • ‘de-DE’: Formato alemán (DD.MM.AAAA)
  • ‘sv-SE’ o InvariantCulture: Formato ISO (AAAA-MM-DD) para máxima compatibilidad
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

Especifica la ruta para el archivo CSV de salida.
Si no se especifica, usa el nombre del archivo de entrada con extensión .csv en el mismo directorio que el archivo de entrada.

Importante: Debe ser una ruta de archivo, no un directorio.
Si quieres usar el directorio del archivo de entrada con un nombre personalizado, especifica la ruta completa incluyendo el nombre del archivo.

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

Especifica el tipo de salida a generar.

Valores válidos:

  • ‘CSV’: Genera solo el archivo de datos con todas las entradas de registro analizadas
  • ‘Statistic’: Genera solo los archivos de estadísticas con métricas agregadas
  • ‘Both’: Genera ambos archivos, datos y estadísticas (por defecto)

Por defecto: Both

Cuando se generan estadísticas, se crean dos archivos separados:

  • ‘_Statistic.csv’: Conteos resumidos por tipo de contexto y día (Fecha, Contexto, Conteo, ComputerName)
  • ‘_PacketStatistic.csv’: Conteos detallados de PACKET por día según IP cliente, protocolo, dirección y tipo de consulta (Fecha, ClientIP, Protocolo, Dirección, TipoDeConsulta, Conteo, 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

Elimina el archivo de registro de depuración DNS fuente tras un procesamiento exitoso.

Úsalo para pipelines automáticos de procesamiento de registros o gestión de espacio en disco.
El archivo fuente solo se elimina si el procesamiento se completa con éxito y se crean todos los archivos de salida.

Seguridad: No puede usarse con -SkipHeaderValidation para evitar eliminación accidental de archivos inválidos.

Advertencia: Los archivos fuente se eliminan permanentemente.
Asegúrate de que los archivos de salida sean válidos antes de usar esta opción.

Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-SkipHeaderValidation

Omite la validación del encabezado del registro de depuración DNS.

Por defecto, el cmdlet valida que los archivos de entrada tengan un encabezado válido de registro de depuración del servidor DNS.
Usa este interruptor para procesar archivos sin validación, útil para:

  • Formatos de registro modificados o personalizados
  • Solución de problemas de validación
  • Registros no estándar o preprocesados

Advertencia: Puede resultar en errores de procesamiento si el archivo no es un registro DNS válido.

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

Muestra qué sucedería si se ejecuta el cmdlet.
El cmdlet no se ejecuta.

Cuando se especifica, muestra información detallada sobre las operaciones que se realizarían sin ejecutarlas realmente.
Útil para:

  • Previsualizar qué archivos se procesarían
  • Verificar rutas de archivos de salida antes del procesamiento
  • Probar scripts antes de ejecutarlos en producción
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

Este cmdlet soporta los parámetros comunes: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction y -WarningVariable. Para más información, consulta about_CommonParameters.

ENTRADAS

System.String[]

NOTAS

Versión : 1.7.0.0
Autor : Andi Bellstedt, Copilot
Fecha : 2026-01-25
Palabras clave : Microsoft Windows Server, DNSServer, DNS, DebugLog, LogParser

ENLACES RELACIONADOS

6 - Ejemplos de Uso

Aquí puedes encontrar ejemplos prácticos de cómo usar el módulo en escenarios reales. Estos ejemplos están diseñados para ayudarte a entender cómo aplicar la funcionalidad del módulo.

Estos son ejemplos con un poco más de profundidad y contexto. Si solo quieres ver el uso de los comandos del módulo, consulta la referencia de comandos.

6.1 - Flujo de trabajo de análisis de seguridad con SQL Server

Convierte registros de depuración DNS a CSV con DNSServer.DebugLogParser, importa el resultado en SQL Server y ejecuta una consulta simple para detectar actividad sospechosa de registros TXT.

Este ejemplo muestra un flujo de trabajo práctico para análisis de seguridad: analiza un registro de depuración DNS con Convert-DNSDebugLogFile, importa el CSV generado en SQL Server y ejecuta una consulta que resalta volúmenes inusualmente altos de búsquedas de registros TXT.

Para una mejor interoperabilidad, este ejemplo escribe marcas de tiempo en un formato tipo ISO usando -OutputCulture 'sv-SE'.

Módulos requeridos

Este ejemplo utiliza los siguientes módulos de PowerShell:

  • DNSServer.DebugLogParser
  • SqlServer

Instálalos si es necesario:

Install-Module -Name DNSServer.DebugLogParser -Scope CurrentUser
Install-Module -Name SqlServer -Scope CurrentUser

Escenario

Usa este flujo de trabajo cuando quieras mover datos analizados de registros de depuración DNS a SQL Server para poder:

  • buscar grandes conjuntos de datos de forma eficiente
  • crear consultas de detección repetibles
  • correlacionar actividad en múltiples servidores DNS
  • conservar datos normalizados para investigaciones posteriores

Salida del paso de conversión

Convert-DNSDebugLogFile no escribe directamente en SQL Server. Primero crea un archivo CSV. Ese archivo CSV es el conjunto de datos que se importa a la base de datos.

En este ejemplo:

  • registro de entrada: C:\Administration\Logs\DNS\dns.log
  • CSV generado: C:\Administration\Logs\DNS\dns.csv
  • tabla destino: dbo.DNSQueries

Crear la tabla destino

Ejecuta la siguiente instrucción una vez en SQL Server para crear la tabla destino.

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 el registro e importar el CSV

El siguiente ejemplo en PowerShell realiza el flujo completo:

  1. importa los módulos requeridos
  2. convierte el registro de depuración DNS a CSV
  3. carga el CSV generado
  4. importa masivamente las filas a 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 "El archivo CSV generado '$csvPath' no contiene filas."
}

$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()
}

Consulta para actividad sospechosa en registros TXT

Una vez que los datos están en SQL Server, puedes buscar clientes que realicen un número inusualmente alto de consultas de registros 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 prefieres ejecutar la consulta desde PowerShell, usa Invoke-Sqlcmd del módulo 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

Por qué las consultas TXT son interesantes

Los volúmenes altos de búsquedas de registros TXT pueden valer la pena revisarse porque pueden indicar:

  • túneles DNS
  • exfiltración de datos por DNS
  • abuso de registros TXT por malware o herramientas
  • clientes inusualmente ruidosos o mal configurados

Esta consulta es solo un punto de partida. En producción, deberías ajustar el umbral y agregar filtros que se adapten a tu entorno.

Notas operativas

  • Import-Csv lee el archivo completo en memoria. Para exportaciones de registros muy grandes, considera un enfoque de streaming en lugar de construir un DataTable completo.
  • Mantén -ComputerName en el paso de conversión para que los registros sigan siendo atribuibles después de la ingestión centralizada.
  • Usa un delimitador y cultura consistentes durante la exportación e importación.
  • Valida la retención, indexación y control de acceso en SQL Server antes de usar este flujo para almacenamiento a largo plazo.

6.2 - Uso práctico en un entorno de dominio (colección y conversión impulsadas por GPO)

Este ejemplo demuestra cómo implementar un flujo de trabajo impulsado por GPO para recopilar y convertir registros de depuración DNS en controladores de dominio.

Este documento describe un ejemplo práctico y completo de ejecución de DNSServer.DebugLogParser en un entorno de dominio de Active Directory, centrado en convertir registros de depuración del servidor DNS de Windows en controladores de dominio.

Este ejemplo se acompaña de un archivo ZIP, que proporciona los artefactos de la política usados para implementar el flujo de trabajo descrito aquí.
Los artefactos más relevantes son el manifiesto de respaldo, el informe de GPO, Files.xml, Set-DNSServerDebugLogging.ps1 y ScheduledTasks.xml.

Escenario

  • Varios controladores de dominio (DC) alojan el rol de servidor DNS.
  • La depuración de DNS está habilitada y configurada de forma consistente en cada DC mediante una tarea programada (escribiendo archivos de registro en C:\Administration\Logs\DNSServer).
  • Un proceso gestionado centralmente convierte los registros a CSV para:
    • análisis de seguridad
    • informes operativos
    • solución de problemas
    • cumplimiento/retención

Resultados esperados

  • Configuraciones de conversión consistentes en todos los DC
  • Ubicación y nombres de salida predecibles
  • Compresión opcional para reducir el espacio de almacenamiento
  • Salidas estadísticas opcionales para resúmenes diarios rápidos
  • Riesgo mínimo en el host, con consideraciones explícitas para reejecución y limpieza

Arquitectura sugerida

Modelo de recopilación: conversión local + extracción central

  1. Cada DC escribe los registros de depuración DNS en disco con habilitación de rollover.
  2. Cada DC convierte los archivos rotados *.log en un CSV de datos y CSVs de estadísticas, luego comprime las salidas en *.zip según un horario (Programador de tareas).
  3. Las salidas se escriben junto a los archivos de registro para mantener la canalización simple.
  4. Un servidor central recopila las salidas *.zip, por ejemplo mediante ingestión por recurso compartido de archivos, copia programada, reenvío SIEM o un colector basado en agente.

Este modelo minimiza las lecturas de red de archivos de registro grandes y mantiene el análisis cerca de los datos.

Flujo de trabajo con GPO

El flujo de trabajo se implementa mediante la Directiva de Grupo (configuración del equipo) para asegurar configuraciones consistentes en todos los controladores de dominio.

Implementación de referencia incluida en este repositorio (informe de GPO):

  • Nombre del archivo/informe: T0-C-Analytics-DNSDebugLogging
  • ID de respaldo: {2B6F16BC-0E7C-4787-83D7-2854FED882EE}
  • Destino del enlace GPO: corp.company.com/Domain Controllers
  • Filtro de elementos (usado tanto para el despliegue de archivos como para tareas programadas): solo aplica si existe C:\Windows\System32\dns.exe

1) Requisitos previos (carpetas + módulo)

La copia de seguridad proporcionada asume que estas carpetas ya existen. Agrega elementos GPP separados si quieres que el despliegue las cree automáticamente:

  • C:\Administration\Scripts
  • C:\Administration\Logs\DNSServer

La copia de seguridad también asume que Convert-DNSDebugLogFile ya está disponible en los DC. La tarea de conversión inicia Windows PowerShell 5.1 con -NoProfile y no importa el módulo explícitamente, por lo que el módulo debe estar instalado en una ruta de módulo de Windows PowerShell a nivel de máquina visible para LocalSystem. Enfoques recomendados:

  • Instalar DNSServer.DebugLogParser en los DC. Por ejemplo, desde PowerShell Gallery (si la política lo permite).
  • Desplegar el módulo vía repositorio interno / recurso compartido de archivos para que sea detectable en $env:PSModulePath
  • Añadir un Import-Module explícito a la acción de la tarea si quieres un comportamiento de carga determinista

2) Desplegar el script de configuración de registro de depuración (GPP Archivos)

La GPO despliega el script:

  • Origen (en SYSVOL vía GPP): %GptPath%\Preferences\Files\Set-DNSServerDebugLogging.ps1
  • Destino (en cada DC): C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1

Esto está implementado en el elemento de preferencia GPP Archivos en Files.xml.

3) Tarea programada: configurar el registro de depuración DNS

La GPO crea una tarea programada llamada Set-DNSServerDebugLogging.

  • Contexto de seguridad en la copia de seguridad suministrada: SYSTEM con tipo de inicio de sesión S4U
  • Disparador en la copia de seguridad suministrada: diario (inicio 2025-03-01T00:00:01)
  • Acción en ScheduledTasks.xml:
    • powershell.exe -ExecutionPolicy RemoteSigned -command " & { C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1 }"
    • Directorio de trabajo: C:\Administration\Scripts

El script vinculado Set-DNSServerDebugLogging.ps1 configura el registro de depuración DNS mediante Get-DnsServerDiagnostics / Set-DnsServerDiagnostics y (notablemente):

  • Habilita el registro en archivo + rollover
  • Escribe en: C:\Administration\Logs\DNSServer\DnsDebugLog_<COMPUTERNAME>.<Domain>_.log
  • Usa un tamaño de rollover de 10 MB por archivo
  • Captura principalmente actividad relacionada con consultas (consultas + notificaciones + actualizaciones + transacciones de preguntas) y excluye el registro completo de paquetes

4) Tarea programada: convertir registros de depuración rotados a CSV comprimido

La GPO crea una tarea programada llamada Convert-DNSDebugLogs.

  • Contexto de seguridad en la copia de seguridad suministrada: SYSTEM con tipo de inicio de sesión InteractiveToken
  • Disparador en la copia de seguridad suministrada: diario (inicio 2026-01-01T00:30:00)
  • Directorio de trabajo: C:\Administration\Logs\DNSServer
  • Acción en ScheduledTasks.xml (formateado para legibilidad):
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

Notas de diseño:

  • Select-Object -Skip 1 evita intencionadamente procesar el archivo de registro más nuevo (activo).
  • Eso significa que los datos actuales solo se exportan después del rollover; en DCs de bajo volumen, el registro activo puede permanecer sin procesar por más de un día.
  • Porque Convert-DNSDebugLogFile por defecto usa -OutputFile en “misma carpeta, mismo nombre, .csv”, las salidas quedan junto a las entradas *.log.
  • Con -CompressOutput, cada registro procesado produce un *.zip y los CSV intermedios se eliminan.
  • A menos que archives o elimines los archivos *.log procesados, ejecuciones posteriores reprocesarán cada registro no activo.
  • La tarea falla si $Error.Count -gt 0 para señalar una ejecución fallida.

5) Ingestión central

Opciones (elige una):

  • Ingestión por recurso compartido de archivos: el DC escribe (o copia) C:\Administration\Logs\DNSServer\*.zip a \\fileserver\share\dns\$env:COMPUTERNAME\... (otorga permisos de recurso compartido y NTFS a las cuentas de equipo DC o al grupo Domain Controllers si la tarea se ejecuta como SYSTEM)
  • Modelo pull: trabajo central lee \\dc\C$\Administration\Logs\DNSServer\*.zip (menos preferido; requiere recursos compartidos administrativos)
  • Reenviador agente: SIEM / canalización de registros que envía las salidas *.zip

Consideraciones operativas

  • Mínimos privilegios: las tareas se ejecutan como SYSTEM; asegúrate de que las carpetas locales sean escribibles y que cualquier destino UNC otorgue acceso a la cuenta de equipo si se usa.
  • Política de firma: ambas tareas usan -ExecutionPolicy RemoteSigned; firma o desbloquea el script y módulo desplegados según tu política.
  • Uso de disco: -CompressOutput ayuda significativamente, pero este flujo no elimina los registros fuente; planifica retención y limpieza.
  • Comportamiento de reprocesamiento: a menos que archives o elimines registros procesados, la tarea de conversión procesará cada archivo *.log no activo nuevamente en ejecuciones posteriores. Esto es simple y robusto, pero puede sobrescribir salidas y crear ingestiones duplicadas si tu colector no hace deduplicación.
  • Consolidación multi-DC: -ComputerName $env:COMPUTERNAME se incluye para que los conjuntos de datos consolidados sean rastreables.
  • Validación: la validación de encabezado permanece habilitada porque la tarea no usa -SkipHeaderValidation (recomendado).

Validar y adaptar (usando el ZIP)

Usa el archivo ZIP como implementación de referencia, luego ajusta los siguientes aspectos a tu entorno:

  • Alcance objetivo: qué DCs / UOs reciben la política
  • Identidad de ejecución: confirma que ambas tareas programadas usan el tipo de inicio de sesión previsto (S4U vs InteractiveToken) o normalízalos a tu estándar
  • Creación de carpetas: decide si C:\Administration\Scripts y C:\Administration\Logs\DNSServer se preconfiguran en otro lugar o deben crearse con elementos GPP adicionales
  • Rutas: confirma que C:\Administration\Scripts y C:\Administration\Logs\DNSServer coinciden con tus estándares
  • Retención: decide si conservar los registros sin procesar y por cuánto tiempo (especialmente si habilitas opciones de limpieza)
  • Ingestión: confirma dónde se escriben las salidas CSV/ZIP y cómo se recopilan centralmente

Si quieres validar la configuración exacta de la GPO sin importarla, las fuentes autorizadas en este repositorio son:

6.3 - Ejemplo de tarea programada

Este ejemplo muestra cómo crear una tarea programada de Windows que ejecuta un script de PowerShell para procesar los registros de depuración DNS diariamente.

Este script crea una tarea programada de Windows que se ejecuta diariamente a las 2:00 AM. Importa el módulo y procesa todos los archivos de registro en la carpeta donde se ejecuta el script (en este ejemplo “C:\Administration\Logs\DNS”). El proceso comprime la salida en archivos ZIP y elimina el original para mantener la limpieza.

$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"