To wielostronicowy widok tej sekcji do wydrukowania. Kliknij aby wydrukować.

Wróć do zwykłego widoku tej strony.

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

SekcjaCzytaj, gdy
PrzeglądChcesz wiedzieć, co robi moduł i czy pasuje do twojego problemu
Formaty wyjścioweMusisz znać znaczenie kolumn CSV przed zaprojektowaniem potoku
Parametry i opcjeZastanawiasz się, które przełączniki są potrzebne do konwersji
WydajnośćTwoje dzienniki są duże lub konwersja jest wolniejsza niż oczekiwano
IntegracjaŁadujesz wyniki do Excela, Power BI, SQL, SIEM lub Pythona
Najlepsze praktyki operacyjneZamierzasz uruchomić to bez nadzoru w środowisku produkcyjnym
Przykłady użyciaChcesz gotowy scenariusz end-to-end do adaptacji
Rozwiązywanie problemówCoś nie działa zgodnie z oczekiwaniami
Referencja poleceńPotrzebujesz autorytatywnej listy parametrów

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 CSV18 kolumn, zawsze w tej samej kolejności, niezależnie od kontekstów w logu
Rekordy wielolinioweBloki szczegółów PACKET i tekst zdarzeń pozostają przy swoim rekordzie
Wersje DNS ServerFormat logów od 2012 R2 do 2025
Wersje PowerShellWindows PowerShell 5.1+ i PowerShell 7.x
Rozmiar plikuTestowane na logach 100 MB+; przetwarzanie jednokrotne, strumieniowe
Walidacja nagłówkaOdrzuca pliki, które nie są debug logami DNS (można wyłączyć)
StatystykiOpcjonalne dzienne podsumowania, według kontekstu i klienta/protokół/typ
Obsługa potokuGet-ChildItem *.log | Convert-DNSDebugLogFile
KompresjaOpcjonalny output ZIP, zwykle o 90% mniejszy
Czyszczenie źródłaOpcjonalne usunięcie logu po udanym przebiegu
Logi międzynarodoweParsuje i zapisuje daty według kultury, więc log de-DE można czytać na stacji en-US
Ścieżki siecioweCzyta źródła z SMB/UNC
Pliki zablokowaneCzyta logi, które DNS Server (lub cokolwiek innego) ma aktualnie otwarte

Aktywny log vs. log rotowany

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:

PlikZawieraTworzony gdy
<name>.csvJeden wiersz na wpis w dzienniku-OutputType CSV lub Both
<name>_Statistic.csvDzienne zliczenie rekordów według kontekstu-OutputType Statistic lub Both
<name>_PacketStatistic.csvDzienne 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:

LokalizacjaKolumna SzczegółyPliki
en-USnieuzupełnionaWithComputerName, NoComputerName
de-DEnieuzupełnionaWithComputerName, NoComputerName
de-DEuzupełnionaWithComputerName, NoComputerName

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:

#KolumnaZnaczenieTypowe zastosowanie
1DateTimeZnacznik czasu wpisuFiltrowanie po czasie, łączenie z innymi dziennikami
2ThreadIdWątek roboczy serwera DNSRzadko potrzebne; przydatne przy korelowaniu problemów wewnętrznych serwera
3ContextRodzaj wpisu: Packet, Event, Note, DSPoll, Init, Lookup, Recurse, Remote, TombstonePierwszy filtr, który zastosujesz — Packet to rzeczywisty ruch DNS
4PacketIdWewnętrzny identyfikator pakietuParowanie zapytania z odpowiedzią
5ProtocolUDP lub TCPSkoki TCP mogą wskazywać na duże odpowiedzi lub transfery stref
6DirectionRcv (zapytanie przyszło) lub Snd (serwer odpowiedział)Oddzielenie wolumenu zapytań od odpowiedzi
7ClientIPAdres hosta zapytującegoAnaliza najaktywniejszych, zakres incydentu
8XidID transakcji DNS (hex)Dopasowanie zapytania i odpowiedzi
9TypeQuery lub Response
10OpcodeStandard, Notify, Update, UnknownOddziela dynamiczne aktualizacje i powiadomienia stref od normalnych zapytań
11FlagsHexSurowe flagi nagłówka (hex)Do głębokiej analizy protokołu
12FlagsCharZdekodowane flagi: Authoritative, Truncated, RecursionDesired, RecursionAvailableCzytelna wersja powyższych
13ResponseCodeNOERROR, NXDOMAIN, SERVFAIL, …Raportowanie błędów, poszukiwanie niepowodzeń rozwiązywania
14QuestionTypeTyp rekordu: A, AAAA, MX, PTR, TXT, …Wolumen TXT to klasyczny wskaźnik tunelowania
15QuestionNameZapytana nazwa jako normalny FQDNDopasowanie wywiadu zagrożeń, raporty top-domen
16InformationWolny tekst dla wpisów Event / Note; dla bloków szczegółów Packet linia nagłówka TCP/UDPOdczyt komunikatów serwera
17DetailsReprezentacja JSON bloku szczegółów Packet; pusta w innych przypadkachPełna inspekcja pakietu bez powrotu do surowego dziennika
18ComputerNameSerwer źródłowy, z -ComputerNameUtrzymanie 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
KolumnaZnaczenie
DateDzień, zawsze yyyy-MM-dd
ContextNazwa kontekstu (Packet, Event, Note, …)
CountLiczba rekordów tego kontekstu w danym dniu
ComputerNameSerwer ź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
KolumnaZnaczenie
DateDzień, zawsze yyyy-MM-dd
ClientIPHost zapytujący
ProtocolUDP lub TCP
DirectionRcv lub Snd
QuestionTypeTyp rekordu DNS
CountLiczba pasujących pakietów tego dnia
ComputerNameSerwer źródłowy

Przykładowe pliki: en-US WithComputerName, en-US NoComputerName, de-DE WithComputerName, de-DE NoComputerName

Separator i format daty

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.

OpcjaDomyślnieZmień, gdy
-InputFile(wymagane)zawsze
-OutputFileścieżka wejściowa z .csvchcesz wynik gdzie indziej
-Delimiter;twój odbiorca oczekuje przecinka, tabulatora lub kreski pionowej
-ComputerNamepustełączysz dzienniki z więcej niż jednego serwera
-OutputTypeBothchcesz tylko dane albo tylko podsumowania
-ContextFilterAllinteresuje cię tylko rzeczywisty ruch DNS
-InputCulturebieżąca kulturadziennik pochodzi z serwera o innej lokalizacji
-OutputCulturebieżąca kulturaplik CSV będzie czytać maszyna
-NoDetailsParsingwyłączoneważniejsza jest przepustowość niż szczegóły pakietów
-CompressOutputwyłączonearchiwizujesz lub przesyłasz wyniki
-RemoveSourceFilewyłączonezaplanowane sprzątanie i ufasz wynikowi
-SkipHeaderValidationwyłączoneplik jest poprawny, ale nagłówek nietypowy

Wejście i wyjście

-InputFile

Ś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.

-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

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 danych
  • Statistic — tylko dwa pliki zbiorcze, bez danych wierszowych
  • Both — 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
Allwszystko (domyślnie)
Packetzapytania i odpowiedzi DNS — dane potrzebne większości analiz
Eventzdarzenia serwera, np. „Serwer DNS został uruchomiony”
Notenotatki 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ą.

-InputCulture

Powiedz parserowi, jaką lokalizację ma dziennik źródłowy:

Convert-DNSDebugLogFile -InputFile "C:\Logs\dns-berlin.log" -InputCulture 'de-DE'
KulturaFormat znacznika czasu w dzienniku
de-DEDD.MM.YYYY HH:MM:SS
en-USM/D/YYYY H:MM:SS AM/PM
en-GBDD/MM/YYYY HH:MM:SS
sv-SEYYYY-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

Siatki bezpieczeństwa

-SkipHeaderValidation

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.

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.

TechnikaEfekt, który zauważysz
StreamReader / StreamWriter z buforami 64 KBPlik jest czytany i zapisywany w kawałkach, zamiast jednym dużym Get-Content
Strumieniowe przetwarzanie, pojedynczy przebiegZużycie pamięci pozostaje mniej więcej stałe, niezależnie od rozmiaru logu
Operacje na stringach (.Substring(), .IndexOf()) zamiast wyrażeń regularnychZnacznie mniej obciążenia CPU na linię, a linii jest miliony
Ręczne zapisywanie CSV zamiast Export-CsvBrak narzutu obiektowego potoku na rekord
Agregacja statystyk oparta na hashtablePodsumowania 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:

  1. 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.
  2. Bloki szczegółów. Jeśli log zawiera pełne szczegóły pakietów i nie użyłeś -NoDetailsParsing, tam idzie czas.
  3. Rozmiar pliku. Jeden wielogigabajtowy log i tak zajmie trochę czasu. Rozwiązuj to przez obrót, nie parametry.
  4. 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.
  5. 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

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:

  1. 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.

  2. Potwierdź, że debugowanie DNS jest faktycznie włączone i zapisuje do oczekiwanej ścieżki:

    Get-DnsServerDiagnostics | Select-Object Enable, LogFilePath, MaxMBFileSize
    
  3. 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

  1. Najpierw dysk — konwersja jest ograniczona przez I/O. Obciążony wolumin lub wolna ścieżka sieciowa dominują czas działania.
  2. 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%.
  3. Użyj -ContextFilter Packet, aby zapisać mniej danych.
  4. Dziel ogromne dzienniki przez obrót dzienników DNS Server zamiast konwertować jeden ogromny plik.
  5. 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:

  1. Zaktualizuj moduł do najnowszej wersji i spróbuj ponownie.

  2. Przeszukaj GitHub issues pod kątem tego samego objawu.

  3. 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.

  4. 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: ''

-InputCulture

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: ''

-InputFile

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: ''

-SkipHeaderValidation

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.

INPUTS

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.DebugLogParser
  • SqlServer

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:

  1. importuje wymagane moduły
  2. konwertuje dziennik debugowania DNS na CSV
  3. wczytuje wygenerowany CSV
  4. 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

  1. Każdy DC zapisuje dzienniki debugowania DNS na dysku z włączonym przełączaniem plików.
  2. 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ń).
  3. Wyniki zapisywane są obok plików dziennika, aby uprościć przepływ.
  4. 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\Scripts
  • C:\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"