5.1 - Convert-DNSDebugLogFile
SYNOPSIS
Przekształca dzienniki debugowania serwera DNS Windows do ustrukturyzowanego formatu CSV do analizy i raportowania.
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] [<CommonParameters>]
ALIASES
Ten cmdlet ma następujące aliasy,
DESCRIPTION
Konwertuje pliki dzienników debugowania serwera DNS Windows na ustrukturyzowane dane CSV, które można analizować
w Excelu, Power BI, bazach danych SQL lub narzędziach SIEM.
Przeznaczony do analizy bezpieczeństwa, monitorowania wydajności,
rozwiązywania problemów i raportowania zgodności.
Cmdlet analizuje dzienniki debugowania DNS i zapisuje spójny wynik CSV do analizy.
Wynik CSV zawiera 18 kolumn, w tym kolumnę Information z tekstem zdarzenia/diagnostycznym,
opcjonalną kolumnę JSON Details dla bloków szczegółów pakietu oraz zawsze obecna kolumnę ComputerName
(pusta, jeśli nie określono).
KLUCZOWE CECHY:
- Przetwarzanie strumieniowe unika ładowania całego pliku do pamięci (odpowiednie dla bardzo dużych dzienników)
- Wysokowydajne parsowanie zoptymalizowane pod kątem dużych plików (100MB+)
- Konfigurowalny separator CSV (domyślnie średnik)
- Opcjonalne podsumowania statystyczne z agregowanymi metrykami
- Filtrowanie kontekstu (Pakiet, Zdarzenie, Notatka i dodatkowe konteksty) do skupienia się na określonych typach wpisów dziennika
- Obsługa kultury przy parsowaniu i formatowaniu dat dla serwerów międzynarodowych
- Obsługa potoku do wsadowego przetwarzania wielu plików
- Opcjonalna kompresja plików wyjściowych (format ZIP)
- Opcjonalne automatyczne usuwanie plików źródłowych po przetworzeniu
- Walidacja nagłówka zapewniająca integralność danych
FORMAT WYJŚCIA:
Kolumna ComputerName jest zawsze dołączana na końcu każdego rekordu.
Jeśli parametr -ComputerName
nie jest określony, kolumna pozostanie pusta.
Zapewnia to spójną strukturę wyjścia
dla scenariuszy konsolidacji wielu serwerów.
WYDAJNOŚĆ:
Zoptymalizowane przy użyciu StreamReader/StreamWriter z buforami 64KB, przetwarzanie strumieniowe dla
efektywnego zarządzania pamięcią dużych plików, operacje na łańcuchach zamiast regex, ręczna generacja CSV
oraz efektywne zbieranie statystyk oparte na hashtable.
KOMPATYBILNOŚĆ:
- PowerShell 5.1+ (edycje Desktop i Core)
- Windows Server 2016+
- Format dzienników serwera DNS od 2012 R2 do 2025
EXAMPLES
PRZYKŁAD 1
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log"
Konwertuje dziennik debugowania DNS z domyślnymi ustawieniami (zarówno pliki danych, jak i statystyk z separatorem średnik).
Wynik:
- C:\Logs\dns.csv
- C:\Logs\dns_Statistic.csv
- C:\Logs\dns_PacketStatistic.csv
PRZYKŁAD 2
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputType CSV
Generuje tylko plik danych bez statystyk.
Wynik: C:\Logs\dns.csv
PRZYKŁAD 3
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputType Statistic
Generuje tylko pliki statystyk z agregowanymi metrykami.
Wynik:
- C:\Logs\dns_Statistic.csv
- C:\Logs\dns_PacketStatistic.csv
PRZYKŁAD 4
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputFile "C:\Output\parsed.csv"
Konwertuje dziennik do niestandardowej lokalizacji wyjściowej.
Wynik: C:\Output\parsed.csv
PRZYKŁAD 5
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -Delimiter "," -ComputerName "DNS01" -OutputType Both
Konwertuje z separatorem przecinka i dodaje kolumnę ComputerName z wartością “DNS01”.
Wynik:
- C:\Logs\dns.csv
- C:\Logs\dns_Statistic.csv
- C:\Logs\dns_PacketStatistic.csv
PRZYKŁAD 6
PS C:\> Get-ChildItem "C:\Logs\*.log" | Convert-DNSDebugLogFile -OutputType Both
Wsadowe przetwarzanie wielu plików dzienników debugowania DNS przez potok.
Wynik: Dla każdego pliku .log generuje pliki .csv i _statistic.csv
PRZYKŁAD 7
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput
Konwertuje i kompresuje wynik do archiwum ZIP.
Wynik: C:\Logs\dns.zip (zawierający dns.csv + pliki statystyk)
PRZYKŁAD 8
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -RemoveSourceFile -Verbose
Konwertuje dziennik i usuwa plik źródłowy po pomyślnym przetworzeniu.
Szczegółowe informacje potwierdzają usunięcie pliku.
PRZYKŁAD 9
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -InputCulture 'de-DE' -OutputCulture 'en-US'
Parsuje niemiecki format daty (DD.MM.YYYY) i wyprowadza w formacie amerykańskim (MM/DD/YYYY).
Używaj podczas przetwarzania dzienników z serwerów o różnych ustawieniach regionalnych.
PRZYKŁAD 10
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter 'Packet'
Konwertuje tylko wpisy pakietów zapytań/odpowiedzi DNS, wykluczając wpisy EVENT i Note.
Używaj, aby skupić analizę na rzeczywistym ruchu DNS.
PRZYKŁAD 11
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter 'Packet','Event'
Konwertuje zarówno pakiety zapytań/odpowiedzi DNS, jak i zdarzenia serwera, wykluczając wpisy Note i inne.
Używaj do analizy ruchu DNS wraz z kontekstem zdarzeń serwera.
PRZYKŁAD 12
PS C:\> Get-ChildItem "C:\Logs\*.log" | Convert-DNSDebugLogFile -RemoveSourceFile -CompressOutput
Automatyczne archiwizowanie dzienników: przetwarza wszystkie dzienniki, kompresuje wynik i usuwa pliki źródłowe.
Idealne do zaplanowanych potoków przetwarzania dzienników.
PRZYKŁAD 13
PS C:\> Convert-DNSDebugLogFile -InputFile "C:\Logs\large-dns.log" -NoDetailsParsing
Przetwarza duży plik dziennika z wyłączonym parsowaniem szczegółów dla maksymalnej wydajności.
Bloki szczegółów PACKET są pomijane, kolumna Details pozostaje pusta.
Używaj, gdy przetwarzasz bardzo duże pliki i nie potrzebujesz szczegółowej analizy struktury pakietów.
PARAMETERS
-CompressOutput
Kompresuje pliki CSV wyjściowe do archiwum ZIP po ich utworzeniu.
Tworzy plik .zip zawierający wygenerowane pliki CSV, a następnie usuwa nieskompresowane CSV.
Plik ZIP jest tworzony w tym samym katalogu co plik wyjściowy CSV o tej samej nazwie bazowej.
Korzyści:
- Znaczne zmniejszenie zajętości dysku (pliki CSV zwykle kompresują się powyżej 90%)
- Ułatwia zarządzanie plikami i archiwizację
- Odpowiednie do długoterminowego przechowywania
Przykład: Plik wejściowy ‘dns.log’ generuje ‘dns.csv’, który jest kompresowany do ‘dns.zip’, a następnie ‘dns.csv’ jest usuwany.
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
Określa wartość dla kolumny ComputerName w wyjściowym pliku CSV.
Kolumna ComputerName
jest zawsze obecna w wyjściu - jeśli parametr nie jest określony, kolumna pozostanie pusta.
Używaj tego podczas konsolidacji dzienników z wielu serwerów DNS, aby zidentyfikować serwer źródłowy w
łączonych zestawach danych.
Uwaga: To NIE jest parametr zdalnego wywołania.
Oznacza tylko etykietę wyjścia.
Jeśli wskażesz -InputFile na
ścieżkę UNC, plik jest czytany z tej ścieżki (nie jest wykonywane WinRM/zdalne wykonanie).
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
Pyta o potwierdzenie przed uruchomieniem cmdletu.
Jeśli określony, pyta o potwierdzenie przed:
- Przetwarzaniem każdego pliku dziennika debugowania DNS
- Usuwaniem plików źródłowych (gdy określono -RemoveSourceFile)
- Nadpisywaniem istniejących plików wyjściowych
Przydatne podczas interaktywnego przetwarzania, gdy chcesz kontrolować, które pliki są przetwarzane.
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
Filtruje, które typy wpisów dziennika mają być uwzględnione w wyjściu.
Akceptuje pojedyncze lub wiele wartości.
Dzienniki debugowania DNS zawierają różne typy kontekstu:
- PACKET: informacje o pakietach zapytań i odpowiedzi DNS (dane podstawowe)
- EVENT: zdarzenia serwera DNS (np. “Serwer DNS został uruchomiony.”)
- Note: notatki diagnostyczne i ostrzeżenia (np. błędy gniazda, stany wewnętrzne)
- DSPoll, Init, Lookup, Recurse, Remote, Tombstone: dodatkowe typy kontekstu
Ważne wartości:
- ‘All’: uwzględnij wszystkie typy kontekstu (domyślnie)
- ‘Packet’: uwzględnij tylko wpisy PACKET (zapytania/odpowiedzi DNS)
- ‘Event’: uwzględnij tylko wpisy EVENT (zdarzenia serwera)
- ‘Note’: uwzględnij tylko wpisy Note (informacje diagnostyczne)
- Dowolna kombinacja: określ wiele wartości, aby uwzględnić konkretne typy kontekstu
Domyślnie: All
Przykłady:
- ‘Packet’ filtruje tylko ruch DNS
- ‘Packet’,‘Event’ uwzględnia zarówno ruch DNS, jak i zdarzenia serwera
- ‘Note’,‘Event’ uwzględnia notatki diagnostyczne i zdarzenia serwera
Uwaga: Przy filtrowaniu do ‘Event’ lub ‘Note’ tylko kolumny DateTime, ThreadId, Context i Information
zawierają dane.
Pozostałe kolumny (Protocol, ClientIP itd.) będą puste.
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
Określa znak separatora dla wyjścia CSV.
Domyślnie: średnik (;)
Popularne alternatywy: przecinek (,), tabulator (`t), pionowa kreska (|)
Używaj średnika w regionach, gdzie przecinek jest separatorem dziesiętnym (Europa).
Używaj przecinka dla standardowych
narzędzi CSV i baz danych oczekujących wartości rozdzielonych przecinkiem.
Type: String
DefaultValue: ;
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: 2
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
Określa kulturę/lokalizację do parsowania wartości daty/czasu w dzienniku debugowania DNS.
Dzienniki debugowania serwera DNS używają formatu daty zgodnego z lokalizacją Windows na serwerze, gdzie dziennik
został wygenerowany.
Używaj tego parametru podczas przetwarzania dzienników z serwerów o różnych ustawieniach regionalnych.
Domyślnie: bieżąca kultura
Popularne przykłady:
- ‘de-DE’ lub ‘de-AT’: format niemiecki (DD.MM.YYYY lub DD/MM/YYYY)
- ’en-US’: format amerykański (MM/DD/YYYY z AM/PM)
- ’en-GB’: format brytyjski (DD/MM/YYYY z czasem 24-godzinnym)
- ‘sv-SE’: format szwedzki/ISO (YYYY-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: ''
Określa ścieżkę do pliku dziennika debugowania DNS do parsowania.
Obsługuje tablice do przetwarzania wielu plików.
Akceptuje dane z potoku z Get-ChildItem lub innych cmdletów generujących pliki.
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
Pomija parsowanie bloków szczegółów PACKET do ustrukturyzowanego formatu JSON.
Jeśli określony, rekordy PACKET z blokami szczegółów będą miały linię informacji TCP/UDP w kolumnie
Information, ale kolumna Details pozostanie pusta.
Znacząco poprawia to
wydajność przetwarzania dużych plików dziennika, gdy nie jest potrzebna szczegółowa analiza struktury pakietów.
Używaj tego przełącznika, gdy:
- Przetwarzasz bardzo duże pliki dziennika (100MB+) i potrzebujesz tylko podstawowych informacji o zapytaniach
- Struktura szczegółów (flagi wiadomości, sekcje DNS) nie jest wymagana do analizy
- Maksymalizacja szybkości parsowania jest ważniejsza niż kompletność danych
Wpływ na wydajność: Może poprawić szybkość przetwarzania o 30-50% dla dzienników z wieloma blokami szczegółów 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
Określa kulturę/lokalizację do formatowania wartości daty/czasu w wyjściowych plikach CSV.
Kontroluje sposób zapisu wartości DateTime do CSV.
Używaj tego, gdy pliki CSV będą wykorzystywane
przez aplikacje lub systemy o określonych ustawieniach regionalnych.
Domyślnie: bieżąca kultura
Popularne przykłady:
- ’en-US’: format amerykański (MM/DD/YYYY)
- ‘de-DE’: format niemiecki (DD.MM.YYYY)
- ‘sv-SE’ lub InvariantCulture: format ISO (YYYY-MM-DD) dla maksymalnej kompatybilności
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
Określa ścieżkę do pliku wyjściowego CSV.
Jeśli nie określono, używa nazwy pliku wejściowego z rozszerzeniem .csv
w tym samym katalogu co plik wejściowy.
Ważne: musi to być ścieżka do pliku, nie katalog.
Jeśli chcesz użyć katalogu pliku wejściowego z
niestandardową nazwą, podaj pełną ścieżkę wraz z nazwą pliku.
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
Określa typ generowanego wyjścia.
Ważne wartości:
- ‘CSV’: generuje tylko plik danych ze wszystkimi przetworzonymi wpisami dziennika
- ‘Statistic’: generuje tylko pliki statystyk z agregowanymi metrykami
- ‘Both’: generuje zarówno pliki danych, jak i statystyk (domyślnie)
Domyślnie: Both
Gdy generowane są statystyki, tworzone są dwa oddzielne pliki:
- ‘_Statistic.csv’: podsumowanie liczby wpisów według typu kontekstu na dzień (Data, Kontekst, Liczba, ComputerName)
- ‘_PacketStatistic.csv’: szczegółowe liczniki PACKET na dzień według IP klienta, protokołu, kierunku
i typu zapytania (Data, ClientIP, Protokół, Kierunek, TypPytania, Liczba, 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
Usuwa źródłowy plik dziennika debugowania DNS po pomyślnym przetworzeniu.
Używaj tego w automatycznych potokach przetwarzania dzienników lub do zarządzania miejscem na dysku.
Plik źródłowy jest
usuwany tylko, jeśli przetwarzanie zakończy się sukcesem i wszystkie pliki wyjściowe zostaną utworzone.
Bezpieczeństwo: Nie można używać z -SkipHeaderValidation, aby zapobiec przypadkowemu usunięciu nieprawidłowych plików.
Ostrzeżenie: Pliki źródłowe są trwale usuwane.
Upewnij się, że pliki wyjściowe są poprawne przed użyciem tej opcji.
Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
Pomija sprawdzanie poprawności nagłówka dziennika debugowania DNS.
Domyślnie cmdlet weryfikuje, czy pliki wejściowe mają poprawny nagłówek dziennika debugowania DNS.
Użyj tego przełącznika, aby przetwarzać pliki bez walidacji, co może być przydatne w przypadku:
- zmodyfikowanych lub niestandardowych formatów dzienników
- rozwiązywania problemów z walidacją
- niestandardowych lub wstępnie przetworzonych dzienników
Ostrzeżenie: Może powodować błędy przetwarzania, jeśli plik nie jest prawidłowym dziennikiem DNS.
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
Pokazuje, co by się stało, gdyby cmdlet został uruchomiony.
Cmdlet nie jest wykonywany.
Jeśli określony, wyświetla szczegółowe informacje o operacjach, które zostałyby wykonane,
bez faktycznego ich wykonania.
Przydatne do:
- podglądu, które pliki zostałyby przetworzone
- weryfikacji ścieżek plików wyjściowych przed przetwarzaniem
- testowania skryptów przed uruchomieniem w środowisku produkcyjnym
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
Ten cmdlet obsługuje parametry wspólne: -Debug, -ErrorAction, -ErrorVariable,
-InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable,
-ProgressAction, -Verbose, -WarningAction i -WarningVariable. Więcej informacji znajdziesz w
about_CommonParameters.
System.String[]
NOTES
Wersja : 1.7.1.1
Autor : Andi Bellstedt, Copilot
Data : 2026-01-26
Słowa kluczowe : Microsoft Windows Server, DNSServer, DNS, DebugLog, LogParser
6.1 - Przepływ pracy analizy bezpieczeństwa z SQL Server
Konwertuj dzienniki debugowania DNS na CSV za pomocą DNSServer.DebugLogParser, importuj wynik do SQL Server i uruchom proste zapytanie wykrywające podejrzaną aktywność rekordów TXT.
Ten przykład pokazuje praktyczny przepływ pracy dla analityki bezpieczeństwa: analizuje dziennik debugowania DNS za pomocą Convert-DNSDebugLogFile, importuje wygenerowany plik CSV do SQL Server i uruchamia zapytanie, które wyróżnia nietypowo dużą liczbę zapytań o rekordy TXT.
Dla najlepszej interoperacyjności ten przykład zapisuje znaczniki czasu w formacie podobnym do ISO, używając -OutputCulture 'sv-SE'.
Wymagane moduły
Ten przykład korzysta z następujących modułów PowerShell:
DNSServer.DebugLogParserSqlServer
Zainstaluj je, jeśli to konieczne:
Install-Module -Name DNSServer.DebugLogParser -Scope CurrentUser
Install-Module -Name SqlServer -Scope CurrentUser
Scenariusz
Użyj tego przepływu pracy, gdy chcesz przenieść przetworzone dane dziennika debugowania DNS do SQL Server, aby móc:
- efektywnie przeszukiwać duże zbiory danych
- tworzyć powtarzalne zapytania wykrywające
- korelować aktywność na wielu serwerach DNS
- przechowywać znormalizowane dane do późniejszej analizy
Wynik kroku konwersji
Convert-DNSDebugLogFile nie zapisuje bezpośrednio do SQL Server. Najpierw tworzy plik CSV. Ten plik CSV jest zbiorem danych importowanym do bazy danych.
W tym przykładzie:
- dziennik wejściowy:
C:\Administration\Logs\DNS\dns.log - wygenerowany CSV:
C:\Administration\Logs\DNS\dns.csv - docelowa tabela:
dbo.DNSQueries
Utwórz tabelę docelową
Uruchom poniższe polecenie raz w SQL Server, aby utworzyć tabelę docelową.
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;
Konwersja dziennika i import CSV
Poniższy przykład PowerShell wykonuje cały przepływ pracy:
- importuje wymagane moduły
- konwertuje dziennik debugowania DNS na CSV
- wczytuje wygenerowany CSV
- masowo importuje wiersze do 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 "Wygenerowany plik CSV '$csvPath' nie zawiera żadnych wierszy."
}
$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()
}
Zapytanie o podejrzaną aktywność rekordów TXT
Gdy dane znajdują się w SQL Server, możesz wyszukać klientów, którzy wykonują nietypowo dużą liczbę zapytań o rekordy 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;
Jeśli wolisz uruchomić zapytanie z poziomu PowerShell, użyj Invoke-Sqlcmd z modułu 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
Dlaczego zapytania TXT są interesujące
Duża liczba zapytań o rekordy TXT może być warta przejrzenia, ponieważ może wskazywać na:
- tunelowanie DNS
- wyciek danych przez DNS
- nadużycie rekordów TXT przez złośliwe oprogramowanie lub narzędzia
- nietypowo hałaśliwych lub źle skonfigurowanych klientów
To zapytanie to tylko punkt wyjścia. W środowisku produkcyjnym powinieneś dostosować próg i dodać filtry odpowiadające twojej infrastrukturze.
Uwagi operacyjne
Import-Csv wczytuje cały plik do pamięci. Przy bardzo dużych eksportach dzienników rozważ podejście strumieniowe zamiast budowania pełnej DataTable.- Zachowaj
-ComputerName w kroku konwersji, aby rekordy pozostały przypisane po centralnym zaimportowaniu. - Używaj spójnego separatora i kultury podczas eksportu i importu.
- Przed użyciem tego przepływu pracy do długoterminowego przechowywania zweryfikuj retencję, indeksowanie i kontrolę dostępu w SQL Server.
6.2 - Praktyczne zastosowanie w środowisku domenowym (zbieranie i konwersja sterowana przez GPO)
Ten przykład pokazuje, jak wdrożyć przepływ pracy sterowany przez GPO do zbierania i konwersji dzienników debugowania DNS na kontrolerach domeny.
Ten dokument przedstawia praktyczny, kompleksowy przykład uruchomienia DNSServer.DebugLogParser w środowisku domeny Active Directory, skupiając się na konwersji dzienników debugowania serwera DNS Windows na kontrolerach domeny.
Do tego przykładu dołączony jest archiwum ZIP, które zawiera artefakty polityki używane do wdrożenia opisanego tutaj przepływu pracy.
Najważniejsze artefakty to manifest kopii zapasowej, raport GPO, Files.xml, Set-DNSServerDebugLogging.ps1 oraz ScheduledTasks.xml.
Scenariusz
- Kilka kontrolerów domeny (DC) pełni rolę serwera DNS.
- Debugowanie DNS jest włączone i spójnie skonfigurowane na każdym DC za pomocą zadania zaplanowanego (zapisujące pliki dziennika do
C:\Administration\Logs\DNSServer). - Centralnie zarządzany proces konwertuje dzienniki na CSV do celów:
- analizy bezpieczeństwa
- raportowania operacyjnego
- rozwiązywania problemów
- zgodności/przechowywania danych
Docelowe rezultaty
- Spójne ustawienia konwersji na wszystkich DC
- Przewidywalna lokalizacja i nazewnictwo plików wyjściowych
- Opcjonalna kompresja zmniejszająca zajętość miejsca
- Opcjonalne statystyki do szybkich podsumowań dziennych
- Minimalne ryzyko po stronie hosta, z wyraźnymi zasadami ponownego uruchomienia i czyszczenia
Proponowana architektura
Model zbierania: lokalna konwersja + centralne pobieranie
- Każdy DC zapisuje dzienniki debugowania DNS na dysku z włączonym przełączaniem plików.
- Każdy DC konwertuje obrócone pliki
*.log na dane CSV i statystyki CSV, a następnie kompresuje wyniki do *.zip według harmonogramu (Harmonogram zadań). - Wyniki są zapisywane obok plików dziennika, aby uprościć potok.
- Centralny serwer zbiera pliki
*.zip, na przykład przez udostępnianie plików, zaplanowane kopiowanie, przekazywanie do SIEM lub kolektor oparty na agencie.
Ten model minimalizuje odczyty sieciowe dużych surowych plików dziennika i utrzymuje analizę blisko danych.
Przepływ pracy GPO
Przepływ pracy jest realizowany przez Politykę Grupową (konfiguracja komputera), aby zapewnić spójne ustawienia na wszystkich kontrolerach domeny.
Referencyjna implementacja zawarta w tym repozytorium (raport GPO):
- Nazwa archiwum/raportu:
T0-C-Analytics-DNSDebugLogging - ID kopii zapasowej:
{2B6F16BC-0E7C-4787-83D7-2854FED882EE} - Cel linku GPO:
corp.company.com/Domain Controllers - Filtr elementów (używany zarówno do wdrożenia plików, jak i zadań zaplanowanych): stosowany tylko jeśli istnieje
C:\Windows\System32\dns.exe
1) Wymagania wstępne (foldery + moduł)
Dostarczona kopia zapasowa zakłada, że te foldery już istnieją. Dodaj osobne elementy GPP, jeśli chcesz, aby wdrożenie tworzyło je automatycznie:
C:\Administration\ScriptsC:\Administration\Logs\DNSServer
Kopia zapasowa zakłada również, że Convert-DNSDebugLogFile jest już dostępny na DC. Zadanie konwersji uruchamia Windows PowerShell 5.1 z -NoProfile i nie importuje modułu jawnie, więc moduł musi być zainstalowany w ścieżce modułów Windows PowerShell widocznej dla LocalSystem. Zalecane podejścia:
- Zainstaluj DNSServer.DebugLogParser na DC, np. z PowerShell Gallery (jeśli polityka na to pozwala).
- Wdróż moduł przez wewnętrzne repozytorium / udział plików, aby był wykrywalny w
$env:PSModulePath - Dodaj jawny
Import-Module do akcji zadania, jeśli chcesz mieć deterministyczne ładowanie
2) Wdrożenie skryptu konfigurującego debugowanie DNS (GPP Files)
GPO wdraża skrypt:
- Źródło (w SYSVOL przez GPP):
%GptPath%\Preferences\Files\Set-DNSServerDebugLogging.ps1 - Cel (na każdym DC):
C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1
Jest to zaimplementowane w elemencie preferencji GPP Files w Files.xml.
3) Zadanie zaplanowane: konfiguracja debugowania DNS
GPO tworzy zadanie zaplanowane o nazwie Set-DNSServerDebugLogging.
- Kontekst bezpieczeństwa w dostarczonej kopii zapasowej:
SYSTEM z typem logowania S4U - Wyzwalacz w dostarczonej kopii zapasowej: codziennie (start
2025-03-01T00:00:01) - Akcja w ScheduledTasks.xml:
powershell.exe -ExecutionPolicy RemoteSigned -command " & { C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1 }"- Katalog roboczy:
C:\Administration\Scripts
Powiązany skrypt Set-DNSServerDebugLogging.ps1 konfiguruje debugowanie DNS za pomocą Get-DnsServerDiagnostics / Set-DnsServerDiagnostics i (co ważne):
- Włącza logowanie do pliku + przełączanie plików
- Zapisuje do:
C:\Administration\Logs\DNSServer\DnsDebugLog_<COMPUTERNAME>.<Domain>_.log - Ustawia rozmiar przełączania na 10 MB na plik
- Rejestruje głównie aktywność związaną z zapytaniami (zapytania + powiadomienia + aktualizacje + transakcje zapytań) i wyklucza pełne logowanie pakietów
4) Zadanie zaplanowane: konwersja obróconych dzienników debugowania do skompresowanego CSV
GPO tworzy zadanie zaplanowane o nazwie Convert-DNSDebugLogs.
- Kontekst bezpieczeństwa w dostarczonej kopii zapasowej:
SYSTEM z typem logowania InteractiveToken - Wyzwalacz w dostarczonej kopii zapasowej: codziennie (start
2026-01-01T00:30:00) - Katalog roboczy:
C:\Administration\Logs\DNSServer - Akcja w ScheduledTasks.xml (formatowana dla czytelności):
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
Uwagi projektowe:
Select-Object -Skip 1 celowo pomija najnowszy (aktywny) plik dziennika.- Oznacza to, że bieżące dane są eksportowane dopiero po przełączeniu; na DC o niskim natężeniu ruchu aktywny dziennik może pozostać nieprzetworzony przez ponad dzień.
- Ponieważ Convert-DNSDebugLogFile domyślnie ustawia
-OutputFile na „ten sam folder, ta sama nazwa, .csv”, wyniki trafiają obok plików *.log. - Z
-CompressOutput każdy przetworzony dziennik generuje *.zip, a pośrednie CSV są usuwane. - Jeśli nie archiwizujesz ani nie usuwasz przetworzonych plików
*.log, kolejne uruchomienia będą ponownie przetwarzać każdy nieaktywny dziennik. - Zadanie zgłasza błąd, jeśli
$Error.Count -gt 0, sygnalizując nieudane uruchomienie.
5) Centralne pobieranie
Opcje (wybierz jedną):
- Pobieranie przez udział plików: DC zapisuje (lub kopiuje)
C:\Administration\Logs\DNSServer\*.zip do \\fileserver\share\dns\$env:COMPUTERNAME\... (przyznaj prawa do udziału i NTFS kontom komputerów DC lub grupie Domain Controllers, jeśli zadanie działa jako SYSTEM) - Model pull: centralne zadanie odczytuje
\\dc\C$\Administration\Logs\DNSServer\*.zip (najmniej preferowane; wymaga udziałów administracyjnych) - Agent forwarder: SIEM / potok logów przesyłający pliki
*.zip
Rozważania operacyjne
- Zasada najmniejszych uprawnień: zadania działają jako
SYSTEM; upewnij się, że lokalne foldery są zapisywalne i że dowolne cele UNC przyznają dostęp kontu komputera, jeśli są używane. - Polityka podpisywania: oba zadania używają
-ExecutionPolicy RemoteSigned; podpisz lub odblokuj wdrożony skrypt i moduł zgodnie z polityką. - Wykorzystanie dysku:
-CompressOutput znacząco pomaga, ale ten przepływ pracy nie usuwa źródłowych dzienników; zaplanuj retencję i czyszczenie. - Zachowanie ponownego przetwarzania: jeśli nie archiwizujesz ani nie usuwasz przetworzonych dzienników, zadanie konwersji będzie ponownie przetwarzać każdy nieaktywny plik
*.log podczas kolejnych uruchomień. To proste i niezawodne, ale może nadpisać wyniki i tworzyć duplikaty w dalszym przetwarzaniu, jeśli kolektor nie deduplikuje. - Konsolidacja wielu DC:
-ComputerName $env:COMPUTERNAME jest dołączone, aby zestawy danych pozostały możliwe do śledzenia. - Walidacja: walidacja nagłówka pozostaje włączona, ponieważ zadanie nie używa
-SkipHeaderValidation (zalecane).
Walidacja i dostosowanie (z użyciem ZIP)
Użyj archiwum ZIP jako implementacji referencyjnej, a następnie dostosuj następujące aspekty do swojego środowiska:
- Zakres docelowy: które DC / OU otrzymują politykę
- Tożsamość wykonania: potwierdź, że oba zadania zaplanowane używają zamierzonego typu logowania (
S4U vs InteractiveToken) lub ujednolić je do swojego standardu - Tworzenie folderów: zdecyduj, czy
C:\Administration\Scripts i C:\Administration\Logs\DNSServer są przygotowane gdzie indziej, czy mają być tworzone przez dodatkowe elementy GPP - Ścieżki: potwierdź, że
C:\Administration\Scripts i C:\Administration\Logs\DNSServer odpowiadają twoim standardom - Retencja: zdecyduj, czy zachować surowe dzienniki i na jak długo (szczególnie jeśli włączasz opcje czyszczenia)
- Pobieranie: potwierdź, gdzie zapisywane są pliki CSV/ZIP i jak są centralnie zbierane
Jeśli chcesz zweryfikować dokładną konfigurację GPO bez importowania, autorytatywne źródła w tym repozytorium to: