O dokumentacji
To jest oficjalna strona dokumentacji DNSServer.DebugLogParser, modułu PowerShell, który przekształca pliki dziennika debugowania serwera DNS Windows w ustrukturyzowane, analizowalne dane CSV.
O module
DNSServer.DebugLogParser powstał z realnej potrzeby: dzienniki debugowania serwera DNS Windows to czytelny dla człowieka tekst, ale nie nadają się do analityki czy raportowania. Ten moduł wypełnia tę lukę, konwertując surowe pliki dziennika do ustrukturyzowanego formatu CSV, który integruje się z popularnymi narzędziami jak Excel, Power BI, bazy danych SQL czy systemy SIEM.
Kluczowe zasady projektowe:
- Wydajność przede wszystkim — zoptymalizowany pod kątem plików 100MB+ z użyciem strumieniowego I/O i operacji na łańcuchach znaków
- Kompatybilność międzyedycyjną — wspiera PowerShell Desktop (5.1+) oraz Core (7.x)
- Gotowy do produkcji — zawiera walidację nagłówków, obsługę błędów i opcjonalną kompresję
- Przyjazny dla potoków — naturalnie integruje się z architekturą potoków PowerShell
Co tu znajdziesz
Nowy w module? Zacznij od Przeglądu.
Zasoby
Współtworzenie
Wkład jest mile widziany. Jeśli znajdziesz błędy, problemy lub masz sugestie ulepszeń, otwórz zgłoszenie lub pull request w repozytorium GitHub.
1 - Przegląd
Co robi DNSServer.DebugLogParser, jak wygląda debug log DNS w Windows, i kiedy warto go konwertować do CSV.
Windows DNS Server może zapisywać debug log. To plik tekstowy, przeznaczony do czytania przez człowieka, który na ruchliwym kontrolerze domeny rośnie o setki megabajtów dziennie. To sprawia, że staje się prawie bezużyteczny, gdy chcesz odpowiedzieć na pytanie typu „który klient pytał o tę domenę 40 000 razy zeszłej nocy?”
DNSServer.DebugLogParser zamienia ten plik tekstowy w tabelę CSV. Jeden wiersz logu staje się jednym wierszem z nazwanymi kolumnami, dzięki czemu możesz otworzyć go w Excelu, załadować do Power BI, masowo wstawić do SQL Server lub wysłać do swojego SIEM.
Moduł zawiera jedno polecenie:
Convert-DNSDebugLogFile -InputFile "C:\Windows\System32\dns\dns.log"
To cały punkt wejścia. Wszystko inne na tej stronie dotyczy działania na dużą skalę, według harmonogramu i na wielu serwerach.
Jak wygląda debug log DNS
Surowy wpis to pojedyncza linia z polami pozycyjnymi, niektóre w nawiasach:
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)
Po konwersji ten sam event to wiersz CSV, który możesz filtrować i sortować:
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
Zwróć uwagę na dwie rzeczy, które w surowym formacie są trudne, a parser za ciebie ogarnia:
- Zapytana nazwa jest zapisana w notacji DNS wire,
(3)odc(9)officeapps(4)live(3)com(0), i staje się normalną nazwą FQDN. - Pojedynczy event nie zawsze to jedna linia. Bloki szczegółów
PACKET i komunikaty zdarzeń kontynuują się na wciętych kolejnych liniach. Parser trzyma je przy rekordzie, do którego należą, zamiast je odrzucać lub tworzyć osierocone wiersze.
Każdy wpis zawiera do 16 natywnych pól — znacznik czasu, protokół, kierunek, IP klienta, typ zapytania, zapytaną nazwę, kod odpowiedzi, flagi i inne. Pełna lista kolumn jest opisana w Formaty wyjściowe.
Po co konwertować
Rozwiązywanie problemów
- Dowiedz się, dlaczego nazwa się nie rozwiązuje i czy zapytanie w ogóle dotarło do serwera
- Zidentyfikuj źle skonfigurowanych klientów lub aplikacje, które zalewają serwer zapytaniami
- Śledź, skąd faktycznie pochodzi problematyczne zapytanie
- Zweryfikuj transfery stref i ogólne zachowanie DNS
Wydajność i pojemność
- Uszereguj klientów według liczby zapytań i znajdź tych hałaśliwych
- Zobacz, które typy rekordów dominują w ruchu
- Wykryj błędy konfiguracji powodujące niepotrzebne zapytania
- Monitoruj obciążenie serwera w czasie zamiast zgadywać
Analiza bezpieczeństwa
- Wykryj tunelowanie DNS i wyciek danych (zwykle widoczne jako nadmierny ruch
TXT — zobacz przykład analizy SQL Server) - Znajdź zapytania do domen malware i command-and-control
- Rozpoznaj wzorce zapytań z zainfekowanego hosta
- Obserwuj nadużycia DNS amplification
- Odtwórz, co się wydarzyło podczas incydentu
Zgodność i audyt
- Spełnij wymogi logowania i przechowywania danych
- Prowadź ścieżkę audytu aktywności sieciowej
- Twórz raporty dla zarządu lub audytorów
Jak działa moduł
Convert-DNSDebugLogFile czyta log jako strumień i zapisuje CSV jako strumień. Plik nigdy nie jest ładowany do pamięci w całości, więc log 100 MB kosztuje mniej więcej tyle samo RAM co 10 MB. Szczegóły w Wydajność.
Co dostajesz:
| Możliwość | Szczegóły |
|---|
| Spójny układ CSV | 18 kolumn, zawsze w tej samej kolejności, niezależnie od kontekstów w logu |
| Rekordy wieloliniowe | Bloki szczegółów PACKET i tekst zdarzeń pozostają przy swoim rekordzie |
| Wersje DNS Server | Format logów od 2012 R2 do 2025 |
| Wersje PowerShell | Windows PowerShell 5.1+ i PowerShell 7.x |
| Rozmiar pliku | Testowane na logach 100 MB+; przetwarzanie jednokrotne, strumieniowe |
| Walidacja nagłówka | Odrzuca pliki, które nie są debug logami DNS (można wyłączyć) |
| Statystyki | Opcjonalne dzienne podsumowania, według kontekstu i klienta/protokół/typ |
| Obsługa potoku | Get-ChildItem *.log | Convert-DNSDebugLogFile |
| Kompresja | Opcjonalny output ZIP, zwykle o 90% mniejszy |
| Czyszczenie źródła | Opcjonalne usunięcie logu po udanym przebiegu |
| Logi międzynarodowe | Parsuje i zapisuje daty według kultury, więc log de-DE można czytać na stacji en-US |
| Ścieżki sieciowe | Czyta źródła z SMB/UNC |
| Pliki zablokowane | Czyta logi, które DNS Server (lub cokolwiek innego) ma aktualnie otwarte |
Aktywny log vs. log rotowany
Uważaj przy czytaniu aktywnych logów
Moduł może czytać plik logu, do którego DNS Server właśnie zapisuje. To wygodne do szybkiego podglądu, ale plik ciągle się zmienia podczas konwersji. Wynik może nie zawierać najnowszych wpisów lub zakończyć się uciętym rekordem.
Do zadań zaplanowanych lub produkcyjnych konwertuj rotowane, zamknięte pliki logów i nigdy nie łącz aktywnego logu z -RemoveSourceFile.
Praktyczny wzorzec to włączenie rotacji logów na serwerze DNS i pozwolenie, by zaplanowana konwersja pominęła najnowszy plik:
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 |
Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
Pełna implementacja oparta na zasadach grupy jest opisana w przykładzie zbierania opartego na GPO.
Co dalej
Licencja i wsparcie
Licencja MIT. Wsparcie społecznościowe odbywa się przez GitHub Issues; zgłaszanie błędów i propozycji funkcji jest mile widziane.
2 - Formaty wyjściowe
Kolumny pliku danych CSV, dwa opcjonalne pliki statystyk oraz rzeczywiste przykładowe wyniki, które możesz otworzyć przed uruchomieniem czegokolwiek.
Convert-DNSDebugLogFile generuje do trzech plików na każdy plik dziennika wejściowego:
| Plik | Zawiera | Tworzony gdy |
|---|
<name>.csv | Jeden wiersz na wpis w dzienniku | -OutputType CSV lub Both |
<name>_Statistic.csv | Dzienne zliczenie rekordów według kontekstu | -OutputType Statistic lub Both |
<name>_PacketStatistic.csv | Dzienne zliczenie zapytań według klienta, protokołu, kierunku i typu rekordu | -OutputType Statistic lub Both |
Both jest ustawieniem domyślnym. Wyniki trafiają obok pliku wejściowego, chyba że ustawisz -OutputFile.
Przykładowe pliki podlinkowane na tej stronie to rzeczywiste wyniki konwersji, a nie makiety. Pobierz jeden i otwórz go w Excelu, zanim zdecydujesz się na projekt potoku.
Plik danych CSV
Przykładowy wynik:
Dwa wiersze z rzeczywistej konwersji — zapytanie DNS i notatka wewnętrzna serwera:
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
Kolumny
Zawsze 18 kolumn, zawsze w tej kolejności:
| # | Kolumna | Znaczenie | Typowe zastosowanie |
|---|
| 1 | DateTime | Znacznik czasu wpisu | Filtrowanie po czasie, łączenie z innymi dziennikami |
| 2 | ThreadId | Wątek roboczy serwera DNS | Rzadko potrzebne; przydatne przy korelowaniu problemów wewnętrznych serwera |
| 3 | Context | Rodzaj wpisu: Packet, Event, Note, DSPoll, Init, Lookup, Recurse, Remote, Tombstone | Pierwszy filtr, który zastosujesz — Packet to rzeczywisty ruch DNS |
| 4 | PacketId | Wewnętrzny identyfikator pakietu | Parowanie zapytania z odpowiedzią |
| 5 | Protocol | UDP lub TCP | Skoki TCP mogą wskazywać na duże odpowiedzi lub transfery stref |
| 6 | Direction | Rcv (zapytanie przyszło) lub Snd (serwer odpowiedział) | Oddzielenie wolumenu zapytań od odpowiedzi |
| 7 | ClientIP | Adres hosta zapytującego | Analiza najaktywniejszych, zakres incydentu |
| 8 | Xid | ID transakcji DNS (hex) | Dopasowanie zapytania i odpowiedzi |
| 9 | Type | Query lub Response | |
| 10 | Opcode | Standard, Notify, Update, Unknown | Oddziela dynamiczne aktualizacje i powiadomienia stref od normalnych zapytań |
| 11 | FlagsHex | Surowe flagi nagłówka (hex) | Do głębokiej analizy protokołu |
| 12 | FlagsChar | Zdekodowane flagi: Authoritative, Truncated, RecursionDesired, RecursionAvailable | Czytelna wersja powyższych |
| 13 | ResponseCode | NOERROR, NXDOMAIN, SERVFAIL, … | Raportowanie błędów, poszukiwanie niepowodzeń rozwiązywania |
| 14 | QuestionType | Typ rekordu: A, AAAA, MX, PTR, TXT, … | Wolumen TXT to klasyczny wskaźnik tunelowania |
| 15 | QuestionName | Zapytana nazwa jako normalny FQDN | Dopasowanie wywiadu zagrożeń, raporty top-domen |
| 16 | Information | Wolny tekst dla wpisów Event / Note; dla bloków szczegółów Packet linia nagłówka TCP/UDP | Odczyt komunikatów serwera |
| 17 | Details | Reprezentacja JSON bloku szczegółów Packet; pusta w innych przypadkach | Pełna inspekcja pakietu bez powrotu do surowego dziennika |
| 18 | ComputerName | Serwer źródłowy, z -ComputerName | Utrzymanie przypisania zbiorów danych z wielu serwerów |
Dwie rzeczy do zaplanowania:
- Nie każda kolumna jest wypełniona w każdym wierszu. Tylko wpisy
Packet mają IP klienta, nazwę zapytania i kod odpowiedzi. Wiersze Note i Event zawierają swój tekst w Information i pozostawiają kolumny protokołu puste. Zaprojektuj schemat bazy danych i filtry w panelu odpowiednio. ComputerName jest zawsze ostatnią kolumną, nawet jeśli nie używasz -ComputerName. Wtedy jest po prostu pusta. To utrzymuje identyczny układ we wszystkich serwerach, więc możesz łączyć pliki z wielu serwerów DNS bez kroku mapowania kolumn.
Kolumna Szczegóły
Bloki szczegółów pojawiają się tylko, jeśli serwer DNS jest skonfigurowany do logowania pełnych szczegółów pakietów. Gdy istnieją, parser konwertuje je do pojedynczej wartości JSON, aby wiersz pozostał jednoliniowy:
{
"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": []
}
}
Parsowanie tych bloków kosztuje czas i znacznie powiększa plik CSV. Jeśli ich nie potrzebujesz, użyj -NoDetailsParsing — kolumna pozostaje obecna, ale pusta, a konwersja jest szybsza. Zobacz Wydajność.
Pliki statystyk
Statystyki to dzienne agregaty. Używaj ich, gdy chcesz trend lub podsumowanie i nie chcesz przenosić pełnego zestawu rekordów — są o rzędy wielkości mniejsze niż plik danych.
Statystyki kontekstu (*_Statistic.csv)
Odpowiadają na pytanie: ile jakiego rodzaju aktywności zdarzyło się danego dnia?
Date;Context;Count;ComputerName
2026-01-20;Event;2;dc01
2026-01-20;Note;2;dc01
2026-01-20;Packet;12;dc01
| Kolumna | Znaczenie |
|---|
Date | Dzień, zawsze yyyy-MM-dd |
Context | Nazwa kontekstu (Packet, Event, Note, …) |
Count | Liczba rekordów tego kontekstu w danym dniu |
ComputerName | Serwer źródłowy |
Przykładowe pliki: en-US WithComputerName, en-US NoComputerName, de-DE WithComputerName, de-DE NoComputerName
Statystyki pakietów (*_PacketStatistic.csv)
Odpowiadają na pytanie: kto zapytał o co, jak często, danego dnia?
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
| Kolumna | Znaczenie |
|---|
Date | Dzień, zawsze yyyy-MM-dd |
ClientIP | Host zapytujący |
Protocol | UDP lub TCP |
Direction | Rcv lub Snd |
QuestionType | Typ rekordu DNS |
Count | Liczba pasujących pakietów tego dnia |
ComputerName | Serwer źródłowy |
Przykładowe pliki: en-US WithComputerName, en-US NoComputerName, de-DE WithComputerName, de-DE NoComputerName
Liczby to sumy, nie unikalne wartości
Count to liczba rekordów w tej dziennej grupie. Klient, który zapytał o tę samą nazwę 500 razy, wnosi 500, a nie 1. Jeśli liczba wydaje się zbyt wysoka, zwykle to jest powód.
Oba typy wyjścia respektują -Delimiter (domyślnie ;) i -OutputCulture. Dla wszystkiego, co będzie importowane przez maszynę, używaj znaczników czasu w stylu ISO:
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputCulture 'sv-SE'
To daje 2026-01-20 23:00:16, które SQL Server, Power BI i pandas odczytują bez wskazówki formatu. Szczegóły w Parametry i opcje.
3 - Parametry i opcje
Co faktycznie zmienia każda opcja Convert-DNSDebugLogFile, kiedy jej potrzebujesz i na jakie pułapki łatwo się natknąć.
Ta strona wyjaśnia opcje prostym językiem i w kolejności, w jakiej zazwyczaj ich potrzebujesz. To przewodnik, a nie specyfikacja — autorytatywna, zawsze aktualna lista parametrów znajduje się w referencji poleceń oraz w:
Get-Help Convert-DNSDebugLogFile -Full
Krótkie podsumowanie
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log"
Ta jedna linia już daje rozsądne zachowanie: pliki danych i statystyk, średnik jako separator, format daty twojej maszyny, włączona walidacja nagłówka, oryginalny plik dziennika nietknięty. Wszystko poniżej to dopracowywanie.
| Opcja | Domyślnie | Zmień, gdy |
|---|
-InputFile | (wymagane) | zawsze |
-OutputFile | ścieżka wejściowa z .csv | chcesz wynik gdzie indziej |
-Delimiter | ; | twój odbiorca oczekuje przecinka, tabulatora lub kreski pionowej |
-ComputerName | puste | łączysz dzienniki z więcej niż jednego serwera |
-OutputType | Both | chcesz tylko dane albo tylko podsumowania |
-ContextFilter | All | interesuje cię tylko rzeczywisty ruch DNS |
-InputCulture | bieżąca kultura | dziennik pochodzi z serwera o innej lokalizacji |
-OutputCulture | bieżąca kultura | plik CSV będzie czytać maszyna |
-NoDetailsParsing | wyłączone | ważniejsza jest przepustowość niż szczegóły pakietów |
-CompressOutput | wyłączone | archiwizujesz lub przesyłasz wyniki |
-RemoveSourceFile | wyłączone | zaplanowane sprzątanie i ufasz wynikowi |
-SkipHeaderValidation | wyłączone | plik jest poprawny, ale nagłówek nietypowy |
Wejście i wyjście
Ścieżka do dziennika do konwersji. Przyjmuje tablicę i dane z potoku — dlatego działa to:
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" | Convert-DNSDebugLogFile
Get-ChildItem zwraca obiekty z właściwością FullName, a -InputFile akceptuje ją po nazwie właściwości (aliasy to m.in. FullName, Path, FilePath). Nie trzeba ForEach-Object.
Działają zarówno ścieżki lokalne, jak i SMB/UNC:
Convert-DNSDebugLogFile -InputFile "\\dc01\C$\Administration\Logs\DNSServer\dns.log"
Polecenie może też otworzyć dziennik, który DNS Server ma aktualnie otwarty. Zobacz aktywne dzienniki poniżej, zanim na tym polegasz.
-OutputFile
Bez tego plik CSV trafia obok pliku wejściowego, z tą samą nazwą bazową i rozszerzeniem .csv. Z tym parametrem kontrolujesz miejsce docelowe.
To musi być ścieżka do pliku, nie folderu
-OutputFile "D:\Processed\" nie oznacza „zapisz do tego folderu”. Podaj pełną ścieżkę wraz z nazwą pliku: -OutputFile "D:\Processed\dns_data.csv".
To też oznacza, że -OutputFile nie ma sensu, gdy przesyłasz wiele plików — każda konwersja zapisywałaby do tego samego pliku. Przy wsadowych uruchomieniach pomiń ten parametr, aby każdy dziennik wygenerował własny CSV.
-Delimiter
Domyślnie średnik, bo w lokalizacjach, gdzie przecinek jest separatorem dziesiętnym, Excel tego oczekuje. Użyj -Delimiter "," dla narzędzi i baz danych, które zakładają klasyczny format CSV z przecinkiem, lub -Delimiter "`t" dla tabulatora.
Cokolwiek wybierzesz, używaj tej samej wartości po stronie importu. Niezgodność to najczęstsza przyczyna, że „wszystko wylądowało w jednej kolumnie”.
Etykietowanie i filtrowanie
-ComputerName
Wypełnia kolumnę ComputerName. Kolumna istnieje zawsze; ten parametr tylko nadaje jej wartość.
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ComputerName $env:COMPUTERNAME
To nie jest parametr zdalnego wywołania
Pomimo nazwy (i aliasów -Server / -DNSServer / -HostName), -ComputerName nie łączy się z niczym. Nie ma WinRM, nie ma zdalnego wykonania. Tylko wpisuje etykietę do wyniku. Aby czytać zdalny dziennik, wskaż -InputFile na ścieżkę UNC.
Ustawiaj zawsze, gdy kilka serwerów zasila jeden zestaw danych — inaczej potem nie odróżnisz, z którego DC pochodzi wiersz.
-OutputType
CSV — tylko plik danychStatistic — tylko dwa pliki zbiorcze, bez danych wierszowychBoth — wszystkie trzy pliki (domyślnie)
Statistic to szybka, mała opcja, gdy potrzebujesz tylko trendów dziennych. CSV jest właściwe, gdy system dalej sam agreguje dane.
-ContextFilter
Dziennik debugowania DNS miesza rzeczywisty ruch zapytań z wewnętrznym szumem serwera. -ContextFilter decyduje, co przejdzie do wyniku.
# tylko prawdziwy ruch DNS
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter Packet
# ruch plus zdarzenia serwera, ale bez not diagnostycznych
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter Packet, Event
| Wartość | Zawiera |
|---|
All | wszystko (domyślnie) |
Packet | zapytania i odpowiedzi DNS — dane potrzebne większości analiz |
Event | zdarzenia serwera, np. „Serwer DNS został uruchomiony” |
Note | notatki diagnostyczne i ostrzeżenia, np. błędy gniazda |
Dodatkowe typy kontekstu (DSPoll, Init, Lookup, Recurse, Remote, Tombstone) pojawiają się pod All.
Filtrowanie tylko do Event lub Note wypełnia tylko DateTime, ThreadId, Context i Information — kolumny protokołu pozostają puste, bo te wpisy ich po prostu nie zawierają.
-ContextFilter Packet to zwykły wybór dla potoków bezpieczeństwa i raportowania: usuwa szum i zauważalnie zmniejsza wynik.
Dzienniki międzynarodowe
Serwer DNS zapisuje znaczniki czasu w lokalizacji Windows maszyny, na której działa. Niemiecki DC zapisze 20.01.2026 23:00:16; amerykański serwer 1/20/2026 11:00:16 PM. Jeśli lokalizacja twojej stacji różni się od serwera, parsowanie się nie uda — albo, co gorsza, dzień i miesiąc się zamienią.
Powiedz parserowi, jaką lokalizację ma dziennik źródłowy:
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns-berlin.log" -InputCulture 'de-DE'
| Kultura | Format znacznika czasu w dzienniku |
|---|
de-DE | DD.MM.YYYY HH:MM:SS |
en-US | M/D/YYYY H:MM:SS AM/PM |
en-GB | DD/MM/YYYY HH:MM:SS |
sv-SE | YYYY-MM-DD HH:MM:SS |
Domyślnie to kultura sesji uruchamiającej polecenie. W środowisku mieszanym ustaw ją jawnie, zamiast polegać na domyśle — i pamiętaj, że zadanie zaplanowane jako SYSTEM może mieć inną kulturę niż ta, której używałeś interaktywnie.
-OutputCulture
Kontroluje, jak znaczniki czasu są zapisywane do CSV:
# wyjście w stylu ISO, które rozumie SQL Server, Power BI i pandas
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputCulture 'sv-SE'
# ten sam efekt, jawna kultura invariant
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" `
-OutputCulture ([System.Globalization.CultureInfo]::InvariantCulture)
Zasada: jeśli człowiek otwiera plik w Excelu, dopasuj lokalną kulturę. Jeśli czyta go maszyna, użyj sv-SE lub kultury invariant i przestań się martwić ustawieniami regionalnymi po stronie importu.
Te dwa parametry są niezależne — możesz czytać szwedzki dziennik i zapisywać wynik w formacie amerykańskim.
Prędkość i miejsce
-NoDetailsParsing
Jeśli serwer DNS loguje pełne szczegóły pakietów, parser zamienia każdy blok szczegółów na JSON w kolumnie Details. To przydatne, ale też najdroższa część działania i powiększa CSV.
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -NoDetailsParsing
Kolumna pozostaje obecna, ale pusta; nagłówek szczegółów TCP/UDP jest dalej w Information. Na dziennikach bogatych w bloki szczegółów może to skrócić czas przetwarzania o 30–50%. Używaj, gdy wystarczy informacja na poziomie zapytań.
-CompressOutput
Spakowuje wygenerowane pliki CSV i usuwa nieskompresowane. dns.log daje dns.zip zamiast dns.csv.
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput
CSV tego typu zwykle kompresuje się o 90% lub więcej, więc to niemal darmowa oszczędność miejsca na archiwa i przesyłanie plików po sieci.
-RemoveSourceFile
Usuwa plik źródłowy .log po udanej konwersji — plik jest usuwany tylko, jeśli wszystkie pliki wyjściowe zostały utworzone.
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput -RemoveSourceFile
Usunięcie jest trwałe
Nie ma tu kosza. Zweryfikuj wynik na prawdziwych dziennikach, zanim włączysz to w zadaniu zaplanowanym i nigdy nie wskazuj na aktywny plik dziennika.
Polecenie celowo odmawia łączenia -RemoveSourceFile z -SkipHeaderValidation, więc nie usuniesz pliku, który nigdy nie został potwierdzony jako dziennik DNS.
Siatki bezpieczeństwa
Domyślnie polecenie sprawdza, czy plik to faktycznie dziennik debugowania DNS Server, zanim go przetworzy. To łapie klasyczny błąd wskazania zadania na zły folder.
Wyłączaj tylko w naprawdę nietypowych przypadkach: ręcznie edytowane dzienniki, wyciągi po filtracji, formaty niestandardowe. Włączaj wszędzie indziej — to tanie i chroni przed literówką i górami śmieci.
-WhatIf i -Confirm
Polecenie obsługuje oba. -WhatIf to właściwy sposób, by zobaczyć, co zrobi nowe zadanie wsadowe:
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Convert-DNSDebugLogFile -RemoveSourceFile -WhatIf
-Confirm pyta przed przetworzeniem każdego pliku, przed usunięciem pliku źródłowego i przed nadpisaniem istniejącego wyniku.
Aktywne dzienniki
Convert-DNSDebugLogFile może czytać plik, który DNS Server ma otwarty. Przydatne do doraźnego podglądu, co się dzieje teraz.
Nie do zadań zaplanowanych ani produkcyjnych
Aktywny dziennik zmienia się podczas czytania. Wynik może pominąć wpisy dodane w trakcie konwersji, a ostatni rekord może być obcięty. Powtórzenie uruchomienia da inny rezultat.
Dla powtarzalnych wyników włącz obrót dzienników na serwerze DNS i konwertuj tylko zamknięte, obrócone pliki — na przykład pomijając najnowszy:
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 |
Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
Składanie wszystkiego razem
Typowe wywołanie produkcyjne na kontrolerze domeny:
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
Czytaj: weź każdy obrócony dziennik oprócz aktywnego, zachowaj tylko ruch DNS, oznacz każdy wiersz nazwą serwera, zapisz znaczniki czasu w formacie maszynowym i zostaw spakowane archiwa. Pełna wersja do zadania zaplanowanego i GPO jest w przykładzie zbierania sterowanym GPO.
4 - Wydajność
Jak parser radzi sobie z logami o rozmiarze 100 MB bez obciążania pamięci serwera oraz co możesz zrobić, aby utrzymać szybkie konwersje.
Logi debugowania DNS na ruchliwym kontrolerze domeny są duże. Convert-DNSDebugLogFile został stworzony właśnie na takie przypadki: był testowany na logach o rozmiarze 100 MB i większych, i przetwarza je w ciągu kilku minut na zwykłym sprzęcie serwerowym.
Dlaczego jest szybki
Nie musisz tego wiedzieć, aby korzystać z modułu, ale wyjaśnia to zachowanie, które zaobserwujesz.
| Technika | Efekt, który zauważysz |
|---|
StreamReader / StreamWriter z buforami 64 KB | Plik jest czytany i zapisywany w kawałkach, zamiast jednym dużym Get-Content |
| Strumieniowe przetwarzanie, pojedynczy przebieg | Zużycie pamięci pozostaje mniej więcej stałe, niezależnie od rozmiaru logu |
Operacje na stringach (.Substring(), .IndexOf()) zamiast wyrażeń regularnych | Znacznie mniej obciążenia CPU na linię, a linii jest miliony |
Ręczne zapisywanie CSV zamiast Export-Csv | Brak narzutu obiektowego potoku na rekord |
| Agregacja statystyk oparta na hashtable | Podsumowania kosztują prawie nic dodatkowo podczas tego samego przebiegu |
Ważna konsekwencja: cały log nigdy nie jest trzymany w pamięci. Log o rozmiarze 500 MB nie wymaga 500 MB RAM. To różnica między modułem a podejściem „wczytaj plik, podziel, zbuduj obiekty”, które stosuje większość domowych skryptów — to podejście działa dobrze na próbce 5 MB, ale zawodzi na prawdziwym DC.
Jak wycisnąć maksimum z uruchomienia
Konwertuj obroty, nie jeden gigantyczny plik
Skonfiguruj serwer DNS, aby obracał log przy rozsądnym rozmiarze — 50 do 200 MB to dobry zakres. Kilka średnich plików konwertuje się w przewidywalnym czasie i pozwala zadaniu zaplanowanemu zakończyć się w wyznaczonym oknie. Jeden ciągle rosnący plik w końcu tego nie zrobi.
Obrót daje też zamknięte pliki do pracy, co i tak jest pożądane:
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 |
Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
Pomijaj szczegółowe parsowanie, gdy nie jest potrzebne
Jeśli serwer DNS zapisuje pełne szczegóły pakietów, zamiana tych bloków na JSON jest najdroższą częścią konwersji.
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -NoDetailsParsing
Spodziewaj się 30–50% szybszych uruchomień na logach zawierających wiele bloków szczegółów, a także znacznie mniejszego pliku CSV. Nadal otrzymujesz dane na poziomie zapytań oraz nagłówek szczegółów TCP/UDP w Information. Zobacz Parametry i opcje.
Filtruj wcześnie
-ContextFilter Packet odrzuca notatki i zdarzenia serwera zanim zostaną zapisane. Mniej danych wyjściowych oznacza mniej operacji I/O, mniejsze pliki i mniej pracy dalej w procesie.
Proś tylko o to, czego potrzebujesz
-OutputType Statistic pomija całkowicie zapis CSV na poziomie wierszy. Jeśli twój dashboard pokazuje tylko dzienne liczniki, to zdecydowanie najtańsza opcja.
Konwertuj lokalnie, potem przenieś wyniki
Moduł czyta ścieżki SMB/UNC, ale przesyłanie surowego logu 200 MB przez sieć do centralnego parsowania jest wolne. Konwertuj na serwerze DNS, a potem przenieś (skompresowany) CSV — zwykle to jedna dziesiąta bajtów. To jest pomysł stojący za przykładem zbierania danych sterowanym GPO.
Kompresuj do transferu i archiwizacji
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput
CSV tego typu zwykle kurczy się o 90% lub więcej. Kompresja kosztuje trochę CPU na końcu uruchomienia, ale oszczędza dużo miejsca na dysku i transferu sieciowego.
Gdy uruchomienie jest wolniejsze niż oczekiwano
Sprawdź kolejno:
- Dysk, nie CPU. Konwersja jest intensywna pod względem I/O. Log na zajętym wolumenie lub czytany przez wolne łącze zdominuje czas działania.
- Bloki szczegółów. Jeśli log zawiera pełne szczegóły pakietów i nie użyłeś
-NoDetailsParsing, tam idzie czas. - Rozmiar pliku. Jeden wielogigabajtowy log i tak zajmie trochę czasu. Rozwiązuj to przez obrót, nie parametry.
- Antywirus. Skanowanie w czasie rzeczywistym zarówno źródłowego logu, jak i wygenerowanego CSV może podwoić koszt I/O. Wykluczenie katalogu logów to powszechna i rozsądna praktyka.
- Presja pamięci. Moduł działa strumieniowo, więc nie powinien być przyczyną — ale serwer już wymieniający pamięć na dysk spowolni wszystko.
Więcej objawów i rozwiązań znajdziesz w Rozwiązywaniu problemów.
5 - Integracja z narzędziami analitycznymi
Jak załadować przekonwertowany plik CSV do Excela, Power BI, SQL Server, SIEM lub notatnika Pythona — wraz z ustawieniami separatora i formatu daty, które sprawiają, że działa to od pierwszego uruchomienia.
Chodzi o to, co się dzieje po konwersji dziennika debugowania DNS. CSV wybrano, bo wszystko go odczytuje — ale „wszystko odczytuje CSV” ukrywa dwa ustawienia, które decydują, czy import będzie bezproblemowy, czy popołudniem spędzonym na poprawkach.
Dwa ustawienia, które decydują o wszystkim
Separator. Domyślnie ;. Zachowaj go dla Excela w lokalizacjach, które używają przecinka jako separatora dziesiętnego. Przełącz na , dla większości baz danych i narzędzi do analizy danych. Cokolwiek wybierzesz, poinformuj o tym stronę importującą.
Format daty. -OutputCulture kontroluje sposób zapisu znaczników czasu. Dla wszystkiego czytanego przez maszynę użyj sv-SE (lub kultury inwariantnej), aby DateTime miał postać 2026-01-20 23:00:16:
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputCulture 'sv-SE'
Każdy z poniższych odbiorców rozumie ten format bez podpowiedzi. Format specyficzny dla lokalizacji, np. 20.01.2026, zostanie zaimportowany jako tekst lub, co gorsza, błędnie odczytany jako miesiąc/dzień.
Microsoft Excel
Najszybszy sposób, by spojrzeć na pojedynczy przekonwertowany dziennik.
- Przy domyślnym separatorze
; i lokalizacji, która go oczekuje, podwójne kliknięcie otwiera plik z poprawnymi kolumnami. - Jeśli wszystko trafia do kolumny A, separator nie pasuje do ustawienia Excela. Uruchom ponownie z
-Delimiter "," lub zaimportuj przez Dane → Z tekstu/CSV i wybierz tam separator. - Zamień zakres na tabelę (
Ctrl+T) i zbuduj tabelę przestawną na ClientIP, QuestionName lub QuestionType. Najaktywniejsi klienci i najczęściej zapytywane domeny zajmą około minuty. - Dla danych powyżej kilkuset tysięcy wierszy użyj Power Query lub jednej z innych poniższych opcji.
Pliki *_Statistic.csv i *_PacketStatistic.csv to zwykle lepsze cele dla Excela — są wstępnie zagregowane i pozostają małe. Zobacz Formaty wyjściowe.
Power BI
Importuj pliki CSV i twórz pulpity do analizy aktywności DNS, top klientów, trendów zapytań i wskaźników błędów.
- Wskaż Power Query na folder z przekonwertowanymi plikami, a nie na pojedynczy plik. Układ jest identyczny między serwerami i dniami, więc pliki są po prostu dopisywane.
- Kolumna
ComputerName umożliwia raport wieloserwerowy — ustaw -ComputerName podczas konwersji, inaczej nie będziesz mógł filtrować po serwerze. ResponseCode i QuestionType to naturalne filtry; DateTime staje się osią czasu.- Zasilanie Power BI plikami
*_PacketStatistic.csv zamiast pełnych danych utrzymuje model małym, gdy potrzebujesz tylko dziennych trendów.
Bazy danych SQL
Masowo załaduj CSV do SQL Server, PostgreSQL lub innej bazy SQL, by przechowywać dane długoterminowo i wykonywać powtarzalne zapytania.
Gotowy przewodnik — definicja tabeli, konwersja, import SqlBulkCopy i zapytanie wykrywające podejrzaną aktywność TXT — jest opisany w Security Analysis Workflow with SQL Server.
Warto zaplanować przed pierwszym załadowaniem:
- Użyj
-OutputCulture 'sv-SE', aby znaczniki czasu trafiły do kolumny datetime2 bez sztuczek konwersji. Information i Details mogą być długie; nadaj im typ nvarchar(max).- Indeksuj to, czego faktycznie używasz w zapytaniach — zwykle
DateTime, ClientIP i QuestionName. - Utrzymuj wypełnione
-ComputerName, aby po scaleniu wiersze były przypisywalne.
Systemy SIEM
Splunk, Elastic, Sentinel i podobne platformy pobierają CSV do korelacji z inną telemetrią bezpieczeństwa i do alertów.
- Wysyłaj skompresowany wynik (
-CompressOutput) — jest około dziesięć razy mniejszy, a większość kolektorów sama go rozpakowuje. - Zdefiniuj mapowanie pól raz; układ kolumn nigdy się nie zmienia między uruchomieniami czy serwerami, w tym zawsze obecna kolumna
ComputerName na końcu. - Niech kolektor usuwa duplikaty lub archiwizuje przetworzone pliki
.log. Job konwersji, który przetwarza te same rotowane logi, inaczej wyśle identyczne wiersze ponownie. -ContextFilter Packet ogranicza wolumen danych (i koszty licencji), gdy notatki serwera nie są potrzebne.
Python, R i narzędzia do analizy danych
Strukturalne wyjście jest gotowe do wykrywania anomalii, tworzenia bazowych wzorców i niestandardowej analityki.
import pandas as pd
df = pd.read_csv(
r"C:\Administration\Logs\DNSServer\dns.csv",
sep=";",
parse_dates=["DateTime"],
)
# top 20 najczęściej zapytywanych nazw, tylko zapytania
top = (
df[df["Direction"] == "Rcv"]
.groupby("QuestionName")
.size()
.sort_values(ascending=False)
.head(20)
)
print(top)
parse_dates działa od razu, gdy wyeksportujesz z -OutputCulture 'sv-SE'. Dalej pandas, scikit-learn czy R radzą sobie z klasteryzacją, sezonowością i wykrywaniem odchyleń jak zwykle.
Pozostając w PowerShell
Nie musisz wychodzić z PowerShell, by szybko uzyskać odpowiedź:
$dns = Import-Csv "C:\Administration\Logs\DNSServer\dns.csv" -Delimiter ';'
# najbardziej hałaśliwi klienci
$dns | Where-Object Direction -eq 'Rcv' |
Group-Object ClientIP |
Sort-Object Count -Descending |
Select-Object -First 10 Count, Name
# nieudane zapytania
$dns | Where-Object ResponseCode -eq 'NXDOMAIN' |
Group-Object QuestionName |
Sort-Object Count -Descending |
Select-Object -First 10 Count, Name
Import-Csv wczytuje cały plik do pamięci, więc nadaje się na rotowany fragment, ale nie na wielogigabajtowy eksport — do tego są bazy danych i SIEM.
6 - Najlepsze praktyki operacyjne
Co zrobić dobrze, zanim pozwolisz na automatyczne uruchamianie konwersji dzienników DNS na produkcyjnych kontrolerach domeny.
Konwersja dziennika ręcznie jest prosta. Uruchamianie jej co noc na każdym kontrolerze domeny, przez lata, bez nadzoru, to już wymaga pewnego zaprojektowania. Oto punkty, które mają znaczenie w praktyce.
1. Konwertuj dzienniki obrócone, nie aktywne
Włącz obracanie dzienników na serwerze DNS i konwertuj tylko zamknięte pliki. Moduł może czytać dziennik, do którego serwer DNS aktualnie zapisuje, ale ten plik zmienia się w trakcie konwersji: najnowsze wpisy mogą być nieobecne, a ostatni rekord może być obcięty. Dwa uruchomienia dają dwa różne wyniki.
Standardowy wzorzec pomija najnowszy plik:
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 |
Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
Nigdy nie łącz aktywnego dziennika z -RemoveSourceFile
Usunięcie pliku, do którego serwer DNS nadal zapisuje, to coś, czego nie chcesz odkryć później. Ogranicz -RemoveSourceFile do obróconych, zamkniętych dzienników.
Warto mieć świadomość kompromisu: na serwerze o niskim natężeniu ruchu obracanie może trwać dłużej niż dobę, więc dane z bieżącego dnia pozostaną nieprzetworzone, dopóki plik się nie obróci. Dopasuj próg obracania odpowiednio.
2. Zaplanuj zadanie i nadaj mu działającą tożsamość
Harmonogram zadań (Task Scheduler) to zwykle miejsce na to — codziennie to rozsądny domyślny wybór. Pełna implementacja GPO dla kontrolerów domeny jest opisana w przykładzie zbierania opartego na GPO, a samodzielne zadanie w przykładzie zadania zaplanowanego.
Trzy rzeczy sprawiają tu problemy:
- Odnajdywanie modułu. Zadanie uruchamiane jako
SYSTEM z -NoProfile widzi tylko moduły dostępne dla całego komputera. Zainstaluj moduł globalnie lub dodaj jawne Import-Module w akcji zadania. - Kultura. Konto uruchamiające zadanie może nie mieć tej samej lokalizacji, na której testowałeś interaktywnie. Ustaw jawnie
-InputCulture i -OutputCulture zamiast polegać na domyślnych. - Dostęp do sieci. Jeśli źródło lub cel to ścieżka UNC,
SYSTEM uwierzytelnia się jako konto komputera. Przyznaj prawa udziału i NTFS dla konta komputera (lub grupy Domain Controllers), albo uruchom zadanie jako dedykowane konto usługi.
3. Obracaj przy rozmiarze, który możesz przetworzyć
50–200 MB na plik utrzymuje konwersje przewidywalne i pozwala na zakończenie zadania nocnego w wyznaczonym czasie. Jeden plik, który rośnie bez końca, w końcu tego nie zapewni. Zobacz Wydajność.
4. Zweryfikuj pierwsze wyniki przed automatyzacją
Uruchom konwersję ręcznie na dwóch lub trzech prawdziwych dziennikach i faktycznie otwórz CSV:
- Czy znaczniki czasu są poprawne — bez zamiany dnia z miesiącem? (Jeśli nie, ustaw
-InputCulture.) - Czy separator odpowiada temu, czego oczekuje odbiorca?
- Czy
ComputerName jest wypełnione? - Czy są obecne potrzebne konteksty, a niepotrzebne są odfiltrowane?
-WhatIf pokaże, które pliki partia by przetworzyła, zanim to zrobi:
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Convert-DNSDebugLogFile -RemoveSourceFile -WhatIf
5. Zdecyduj, co zrobić z przetworzonymi dziennikami
Zadanie, które po prostu konwertuje „wszystkie dzienniki oprócz najnowszego”, będzie przetwarzać te same pliki co noc. To jest solidne i proste, ale nadpisuje wyniki i może wprowadzać duplikaty do systemu, który je pobiera.
Wybierz jedno:
- przenieś przetworzone pliki
.log do folderu archiwum - usuń je z
-RemoveSourceFile, gdy zaufasz już potokowi - spraw, by kolektor po stronie odbiorcy usuwał duplikaty
Cokolwiek wybierzesz, zapisz to — to szczegół, który myli kolejnego administratora.
6. Zaplanuj miejsce na dane i okres przechowywania
Kompresja (-CompressOutput) zwykle zmniejsza CSV o 90% lub więcej, ale objętość i tak rośnie. Oszacuj na podstawie faktycznego tempa zapytań i wymagań retencji, i ustaw datę końcową dla danych zamiast pozwalać im rosnąć bez końca.
-OutputType Statistic warto rozważyć przy długim okresie przechowywania: dzienne podsumowania są malutkie i często odpowiadają na pytania o trendy, dla których dawniej przechowywano szczegółowe dane.
7. Traktuj wynik jako wrażliwy
Przetworzone dzienniki DNS opisują twoją wewnętrzną strukturę nazw i kto czego szukał. To bardziej ujawniające niż większość dzienników infrastruktury i w zależności od jurysdykcji może być traktowane jako dane osobowe.
- Ogranicz uprawnienia NTFS i udziału do folderów wyjściowych.
- Nie zostawiaj CSV na ogólnodostępnym udziale „tymczasowo”.
- Uwzględnij dane dzienników DNS w polityce retencji i usuwania, nie tylko w polityce kopii zapasowych.
- Skompresowany wynik jest mniejszy, ale nie chroniony — stosuj szyfrowanie lub kontrolę dostępu tam, gdzie to ważne.
8. Zachowaj weryfikację nagłówka
Domyślna kontrola, czy plik to naprawdę dziennik debugowania DNS, nic nie kosztuje i zapobiega tworzeniu tysięcy nonsensownych wierszy przez literówkę w ścieżce. Używaj -SkipHeaderValidation tylko dla naprawdę nietypowych formatów — i pamiętaj, że polecenie odmawia łączenia tego z `-RemoveSourceFile właśnie z tego powodu.
9. Monitoruj zadanie, nie tylko serwer
Automatyczna konwersja, która cicho przestaje działać, jest gorsza niż brak konwersji, bo luka jest zauważana dopiero, gdy ktoś potrzebuje danych.
- Obserwuj wyjście błędów różne od zera; referencyjna implementacja GPO celowo rzuca wyjątkiem, gdy
$Error.Count -gt 0, by zadanie zgłaszało błąd. - Alarmuj na podstawie ostatniego kodu wyniku zadania zaplanowanego, nie tylko na istnienie zadania.
- Sprawdzaj, czy pliki wyjściowe faktycznie pojawiają się z aktualnymi znacznikami czasu.
- Monitoruj wolne miejsce na dysku zarówno na wolumenie dzienników, jak i na miejscu docelowym.
Typowe przyczyny nieudanego uruchomienia — odmowa dostępu, uszkodzone dzienniki, nieprawidłowe nagłówki — są omówione w Rozwiązywaniu problemów.
10. Dokumentuj proces
Gdzie zapisywane są dzienniki, kiedy uruchamia się zadanie, jakie parametry są używane, gdzie trafia wynik, kto go pobiera i jak długo jest przechowywany. Sześć linijek w twojej wiki operacyjnej. To właśnie sprawia, że konfiguracja jest audytowalna i możliwa do przekazania dalej.
7 - Rozwiązywanie problemów
Objawy, na które najprawdopodobniej natkniesz się podczas konwersji dzienników debugowania DNS, co je powoduje i jak je naprawić.
„Plik nie jest prawidłowym plikiem dziennika debugowania DNS”
Sprawdzenie nagłówka odrzuciło dane wejściowe. Zwykle ścieżka jest po prostu błędna — plik .log w tym samym folderze, który nie jest dziennikiem debugowania DNS, lub plik zawierający tylko obrócony nagłówek.
Przejdź przez to krok po kroku:
Otwórz plik. Dziennik debugowania DNS zaczyna się od linii nagłówka takiej jak Message logging started at … i zawiera wpisy zapytań z oznaczeniem czasu.
Potwierdź, że debugowanie DNS jest faktycznie włączone i zapisuje do oczekiwanej ścieżki:
Get-DnsServerDiagnostics | Select-Object Enable, LogFilePath, MaxMBFileSize
Jeśli plik faktycznie jest dziennikiem DNS, ale nagłówek jest nietypowy — ręcznie edytowany, wstępnie filtrowany, niestandardowy eksport — pomiń sprawdzanie:
Convert-DNSDebugLogFile -InputFile "C:\Logs\odd.log" -SkipHeaderValidation
Zachowaj weryfikację w pozostałych miejscach. Pamiętaj, że -SkipHeaderValidation nie może być łączone z -RemoveSourceFile, więc niezweryfikowany plik nigdy nie zostanie usunięty podczas konwersji.
Plik wyjściowy jest pusty lub ma znacznie mniej wierszy niż oczekiwano
Sprawdź kolejno:
- Czy dziennik w ogóle zawiera wpisy zapytań? Świeżo obrócony dziennik może zawierać tylko nagłówek, jeśli jeszcze nie było zapytań.
- Czy używasz
-ContextFilter? -ContextFilter Packet usuwa wpisy Event i Note zgodnie z założeniem. Jeśli filtrowałeś do Event lub Note, większość kolumn będzie pusta — te typy wpisów zawierają tylko DateTime, ThreadId, Context i Information. - Czy dziennik źródłowy był aktywny? Plik, do którego DNS Server nadal zapisuje, może się zmieniać podczas konwersji; najnowsze wpisy mogą być nieobecne, a ostatni rekord może być obcięty. Konwertuj obrócony, zamknięty dziennik, gdy potrzebujesz kompletnego wyniku.
- Czy plik jest uszkodzony lub obcięty? Sprawdź koniec dziennika pod kątem niedokończonej linii.
Daty są błędne, przesunięte lub dzień i miesiąc są zamienione miejscami
Dziennik został zapisany przez serwer z inną lokalizacją Windows niż sesja wykonująca konwersję. 20.01.2026 i 01/20/2026 opisują ten sam moment, ale tylko jeśli obie strony zgadzają się co do formatu.
# dziennik pochodzi z niemieckiego serwera
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns-berlin.log" -InputCulture 'de-DE'
Ustaw -InputCulture jawnie w zadaniach zaplanowanych, zamiast polegać na kulturze konta, które je uruchamia. Jeśli wynik ma być czytelny dla maszyny, dodaj -OutputCulture 'sv-SE'. Szczegóły w Parametry i opcje.
Wszystko trafia do jednej kolumny po imporcie
Niezgodność separatora. Moduł domyślnie używa ;; twój program oczekiwał , (lub odwrotnie).
Albo uruchom konwersję ponownie z separatorem, którego oczekuje odbiorca:
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -Delimiter ","
…albo powiedz importerowi, jaki separator ma plik — w Excelu przez Dane → Z tekstu/CSV, w PowerShell przez Import-Csv -Delimiter ';'.
„Odmowa dostępu”
- Katalog dzienników DNS zwykle wymaga uprawnień administratora. Uruchom PowerShell jako administrator lub uruchom zadanie zaplanowane na koncie z dostępem.
- Sprawdź także uprawnienia zapisu do katalogu wyjściowego, nie tylko odczytu dziennika.
- Dla ścieżek SMB/UNC: zadanie uruchamiane jako
SYSTEM uwierzytelnia się w sieci jako konto komputera. Przyznaj prawa udziału i NTFS temu kontu komputera (lub grupie Domain Controllers), albo użyj dedykowanego konta usługi. - Jeśli
-RemoveSourceFile nie powiodło się na końcu pomyślnego przebiegu, konto może czytać dziennik, ale nie może go usunąć.
Przetwarzanie jest bardzo wolne
- Najpierw dysk — konwersja jest ograniczona przez I/O. Obciążony wolumin lub wolna ścieżka sieciowa dominują czas działania.
- Użyj
-NoDetailsParsing, jeśli nie potrzebujesz szczegółów pakietu w formacie JSON; na dziennikach z dużą ilością szczegółów oszczędza to 30–50%. - Użyj
-ContextFilter Packet, aby zapisać mniej danych. - Dziel ogromne dzienniki przez obrót dzienników DNS Server zamiast konwertować jeden ogromny plik.
- Rozważ wykluczenie katalogu dzienników z antywirusa.
Więcej w Wydajność.
Skompresowany plik wyjściowy jest większy niż oczekiwano
Dzienniki o bardzo różnorodnej zawartości — wiele unikalnych domen, wielu różnych klientów — kompresują się gorzej niż powtarzalne. To normalne. ZIP zwykle i tak osiąga znaczną redukcję; jeśli nie, sprawdź, czy kolumna Details nie powiększa pliku i czy w ogóle jej potrzebujesz.
Statystyki nie zgadzają się z oczekiwaniami
- Potwierdź, że użyłeś
-OutputType Both lub -OutputType Statistic. Przy -OutputType CSV pliki statystyk nie są w ogóle zapisywane. Count to suma, nie liczba unikalna. Jeden klient pytający o tę samą nazwę 500 razy daje 500. To najczęstsza przyczyna „ta liczba nie może być prawidłowa”.- Statystyki są grupowane na dni. Dziennik obejmujący dwa dni daje wiersze dla obu.
- Jeśli
ComputerName jest pusty w plikach statystyk, podczas konwersji nie ustawiono -ComputerName.
Zadanie zaplanowane działa interaktywnie, ale nie jako zadanie
Prawie zawsze jedna z trzech rzeczy:
- Moduł nie znaleziony.
SYSTEM z -NoProfile widzi tylko ścieżki modułów globalnych. Zainstaluj moduł globalnie lub dodaj jawne Import-Module DNSServer.DebugLogParser do akcji zadania. - Zła kultura. Lokalizacja konta zadania różni się od twojej. Ustaw jawnie
-InputCulture i -OutputCulture. - Polityka wykonania lub niepodpisany skrypt. Dopasuj
-ExecutionPolicy zadania do swojej polityki podpisywania i odblokuj pliki skopiowane z innych miejsc.
Uruchom dokładną linię poleceń zadania ręcznie w tym samym kontekście (np. z PsExec jako SYSTEM), aby odtworzyć problem.
Zgłaszanie problemu
Jeśli nic z powyższego nie pomaga:
Zaktualizuj moduł do najnowszej wersji i spróbuj ponownie.
Przeszukaj GitHub issues pod kątem tego samego objawu.
Zbierz diagnostykę:
$PSVersionTable
Get-Module DNSServer.DebugLogParser -ListAvailable | Select-Object Name, Version, Path
Get-Culture
oraz dokładne polecenie, które wykonałeś, pełny komunikat błędu wraz ze śladem stosu i — jeśli możesz udostępnić — mały zanonimizowany fragment dziennika, który odtwarza problem.
Otwórz nowe zgłoszenie z tymi informacjami.
8 - Referencja poleceń modułu
Tutaj znajdziesz referencję wszystkich poleceń w module. Ta referencja ma pomóc Ci szybko znaleźć potrzebne polecenie i zrozumieć, jak skutecznie z niego korzystać.
Klikając na polecenie, zostaniesz przeniesiony do szczegółowej strony zawierającej kompleksowe informacje o poleceniu, w tym jego składnię, parametry, przykłady oraz dodatkowe uwagi lub wskazówki dotyczące użytkowania.
8.1 - Convert-DNSDebugLogFile
SYNOPSIS
Konwertuje 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]
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 jest kolumna 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 zagregowanymi metrykami
- Filtrowanie kontekstu (Pakiet, Zdarzenie, Notatka i dodatkowe konteksty) do skupienia się na określonych typach wpisów
- Obsługa kultury dla parsowania i formatowania 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
w scenariuszach konsolidacji z wielu serwerów.
WYDAJNOŚĆ:
Zoptymalizowany za pomocą 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 DNS Server 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 zagregowanymi 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.
Wynik szczegółowy potwierdza 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.RRRR) i zapisuje w formacie amerykańskim (MM/DD/RRRR).
Używaj przy przetwarzaniu 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 Note i inne wpisy.
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 przy bardzo dużych plikach, gdy szczegółowa analiza struktury pakietu nie jest potrzebna.
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 pliki CSV.
Plik ZIP jest tworzony w tym samym katalogu co plik CSV o tej samej nazwie bazowej.
Zalety:
- Znaczne zmniejszenie zajętości dysku (pliki CSV zwykle kompresują się o 90%+)
- Ułatwia zarządzanie plikami i archiwizację
- Odpowiednie do długoterminowego przechowywania
Przykład: Plik wejściowy ‘dns.log’ generuje ‘dns.csv’ skompresowany 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ść 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 przy konsolidacji dzienników z wielu serwerów DNS, aby zidentyfikować źródłowy serwer w
połączonych zestawach danych.
Uwaga: To NIE jest parametr zdalny.
Oznacza tylko etykietę w wyjściu.
Jeśli wskażesz -InputFile
na ścieżkę UNC, plik jest odczytywany 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.
Po określeniu 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 przy interaktywnym przetwarzaniu, 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 gniazdek, stany wewnętrzne)
- DSPoll, Init, Lookup, Recurse, Remote, Tombstone: Dodatkowe typy kontekstu
Dopuszczalne 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ć wybrane 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, na którym dziennik został wygenerowany.
Użyj tego parametru przy przetwarzaniu 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.RRRR lub DD/MM/RRRR)
- ’en-US’: format amerykański (MM/DD/RRRR z AM/PM)
- ’en-GB’: format brytyjski (DD/MM/RRRR z czasem 24-godzinnym)
- ‘sv-SE’: format szwedzki/ISO (RRRR-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.
Po określeniu rekordy PACKET z blokami szczegółów będą miały linię informacji TCP/UDP w kolumnie Information, ale kolumna Details pozostanie pusta.
To znacznie poprawia
wydajność przetwarzania dużych plików dziennika, gdy szczegółowa analiza struktury pakietu nie jest potrzebna.
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ą konsumowane
przez aplikacje lub systemy o określonych ustawieniach regionalnych.
Domyślnie: bieżąca kultura
Popularne przykłady:
- ’en-US’: format amerykański (MM/DD/RRRR)
- ‘de-DE’: format niemiecki (DD.MM.RRRR)
- ‘sv-SE’ lub InvariantCulture: format ISO (RRRR-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 katalogu.
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.
Dopuszczalne wartości:
- ‘CSV’: Generuje tylko plik danych ze wszystkimi przetworzonymi wpisami dziennika
- ‘Statistic’: Generuje tylko pliki statystyk z zagregowanymi 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, 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
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 Server.
Użyj tego przełącznika, aby przetwarzać pliki bez walidacji, co może być przydatne w przypadku:
- Zmienionych 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.
Po określeniu 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 produkcji
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 oraz -WarningVariable. Więcej informacji znajdziesz w
about_CommonParameters.
System.String[]
NOTES
Version : 1.7.2.1
Author : Andi Bellstedt, Copilot, Patrick Charbonnier (Silent Waters IT Consulting S.L.)
Date : 2026-07-24
Keywords : Microsoft Windows Server, DNSServer, DNS, DebugLog, LogParser
9 - Przykłady użycia
Tutaj znajdziesz praktyczne przykłady, jak używać modułu w rzeczywistych sytuacjach. Te przykłady mają pomóc Ci zrozumieć, jak zastosować funkcje modułu.
To są przykłady z nieco większą głębią i kontekstem. Jeśli chcesz poznać tylko użycie poleceń z modułu, sprawdź referencję poleceń.
9.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.
9.2 - Praktyczne zastosowanie w środowisku domenowym (kolekcja 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
- Wiele 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 do formatu CSV dla:
- analityki bezpieczeństwa
- raportowania operacyjnego
- rozwiązywania problemów
- zgodności/przechowywania danych
Cele
- Spójne ustawienia konwersji na wszystkich DC
- Przewidywalna lokalizacja i nazewnictwo plików wyjściowych
- Opcjonalna kompresja w celu zmniejszenia zajętości miejsca
- Opcjonalne statystyki dla szybkich podsumowań dziennych
- Minimalne ryzyko po stronie hosta, z wyraźnym uwzględnieniem ponownego uruchomienia i czyszczenia
Sugerowana 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 zapisywane są obok plików dziennika, aby uprościć przepływ.
- Centralny serwer zbiera pliki
*.zip, np. 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 zasady grupy (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 wdrażania plików, jak i zadań zaplanowanych): stosuje się 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
Dostarczona kopia 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) Wdróż skrypt konfigurujący 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:
SYSTEM z typem logowania S4U - Wyzwalacz w dostarczonej kopii: 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:
SYSTEM z typem logowania InteractiveToken - Wyzwalacz w dostarczonej kopii: 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. Convert-DNSDebugLogFile potrafi czytać dziennik, który DNS Server aktualnie otworzył, ale ten plik zmienia się podczas czytania: wynik może pominąć najnowsze wpisy lub zakończyć się obciętym rekordem, a dwa uruchomienia nie dają identycznych rezultatów. Pomijanie aktywnego pliku zapewnia powtarzalność wyników zaplanowanego zadania.- 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ń. Zmniejsz rozmiar przełączania, jeśli to opóźnienie jest zbyt długie dla Twojego zastosowania.
- 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 pliki CSV są usuwane. - Jeśli nie archiwizujesz ani nie usuwasz przetworzonych plików
*.log, kolejne uruchomienia ponownie przetworzą każdy nieaktywny dziennik. - Zadanie zgłasza błąd, jeśli
$Error.Count -gt 0, aby sygnalizować niepowodzenie.
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 czyta
\\dc\C$\Administration\Logs\DNSServer\*.zip (najmniej preferowane; wymaga udziałów administracyjnych) - Agent forwarder: SIEM / pipeline logów przesyłający pliki
*.zip
Uwagi operacyjne
- Najmniejsze uprawnienia: zadania działają jako
SYSTEM; upewnij się, że lokalne foldery są zapisywalne i że ewentualne 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 nie usuwa źródłowych dzienników; zaplanuj retencję i czyszczenie. - Zachowanie przy ponownym przetwarzaniu: jeśli nie archiwizujesz ani nie usuwasz przetworzonych dzienników, zadanie konwersji będzie ponownie przetwarzać każdy nieaktywny plik
*.log przy kolejnych uruchomieniach. 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 zbiory danych pozostały śledzone. Uwaga: -ComputerName tylko oznacza wynik — nie wykonuje połączenia zdalnego. - Udziały sieciowe: Convert-DNSDebugLogFile potrafi czytać źródłowe dzienniki z ścieżek SMB/UNC, ale lokalna konwersja i przesyłanie skompresowanych wyników pozostaje lepszym wzorcem dla dużych surowych dzienników. Jeśli używasz ścieżki UNC, pamiętaj, że zadanie działające jako
SYSTEM uwierzytelnia się w sieci jako konto komputera i potrzebuje praw do udziału i NTFS. - Format daty:
-OutputCulture sv-SE jest używany celowo, aby znaczniki czasu zapisywały się jako 2026-01-20 23:00:16. Ten format jest odczytywany bez wskazówek przez SQL Server, Power BI i większość narzędzi importu, niezależnie od lokalizacji DC, który wygenerował dziennik. - 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 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ą wyniki 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:
9.3 - Przykład zaplanowanego zadania
Ten przykład pokazuje, jak utworzyć zaplanowane zadanie Windows, które codziennie uruchamia skrypt PowerShell do przetwarzania dzienników debugowania DNS.
Ten skrypt tworzy zaplanowane zadanie Windows, które uruchamia się codziennie o 2:00 rano. Importuje moduł i przetwarza wszystkie pliki dziennika w folderze, w którym jest wykonywany skrypt (w tym przykładzie “C:\Administration\Logs\DNS”). Proces kompresuje wynik do plików ZIP i usuwa oryginały, aby zachować porządek.
$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"