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

Wróć do zwykłego widoku tej strony.

O tej dokumentacji

To jest oficjalna strona dokumentacji dla 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 są czytelne dla człowieka, ale nie nadają się do analiz 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 powyżej 100MB, wykorzystujący strumieniowe operacje I/O i operacje na łańcuchach znaków
  • Kompatybilność między edycjami — wspiera PowerShell Desktop (5.1+) oraz Core (7.x)
  • Gotowy do produkcji — zawiera walidację nagłówków, obsługę błędów oraz opcjonalną kompresję
  • Przyjazny dla potoku — naturalnie integruje się z architekturą potokową PowerShell

Zasoby

Współpraca

Wkłady są mile widziane. Jeśli znajdziesz błędy, problemy lub masz sugestie ulepszeń, prosimy o otwarcie zgłoszenia lub pull requesta w repozytorium GitHub.

1 - Przegląd

DNSServer.DebugLogParser to moduł PowerShell, który przekształca pliki dziennika debugowania serwera DNS Windows w ustrukturyzowane, analizowalne dane CSV do analizy bezpieczeństwa, monitorowania wydajności, rozwiązywania problemów oraz raportowania zgodności.

Co to jest dziennik debugowania DNS?

Logowanie debugowania DNS to funkcja serwera DNS Windows, która rejestruje szczegółowe informacje o operacjach DNS. Po włączeniu serwer DNS zapisuje wpisy dziennika do pliku tekstowego (zwykle dns.log) w katalogu serwera DNS.

Każdy wpis dziennika zawiera do 16 pól, w tym:

  • Datę i godzinę zapytania
  • Używany protokół (UDP lub TCP)
  • Kierunek (Wysyłanie lub Odbieranie)
  • Adres IP klienta
  • Typ zapytania (A, AAAA, MX, PTR itd.)
  • Nazwę domeny zapytanej
  • Kod odpowiedzi (NOERROR, NXDOMAIN itd.)
  • Flagi i opcje zapytania
  • Adres IP w odpowiedzi (dla udanych zapytań)
  • Numery portów i dodatkowe szczegóły techniczne

Dlaczego warto analizować dzienniki debugowania DNS?

Dzienniki DNS są kluczowe dla:

Rozwiązywania problemów

  • Diagnozowania błędów rozwiązywania nazw
  • Identyfikowania źle skonfigurowanych klientów lub aplikacji
  • Śledzenia źródła problematycznych zapytań
  • Weryfikacji poprawnej konfiguracji DNS i transferów stref

Monitorowania wydajności

  • Identyfikowania źródeł zapytań o dużym wolumenie
  • Analizowania typów i wzorców zapytań w celu optymalizacji infrastruktury DNS
  • Wykrywania problemów konfiguracyjnych powodujących nadmierne zapytania
  • Śledzenia czasów odpowiedzi i wskaźników sukcesu
  • Monitorowania obciążenia i pojemności serwera DNS

Analizy bezpieczeństwa

  • Wykrywania tunelowania DNS i prób wycieku danych
  • Identyfikowania domen powiązanych z malware i serwerami dowodzenia i kontroli
  • Śledzenia podejrzanych wzorców zapytań, które mogą wskazywać na zainfekowane systemy
  • Monitorowania ataków amplifikacyjnych DNS
  • Badania incydentów bezpieczeństwa i śledzenia aktywności atakujących

Zgodności i audytu

  • Spełniania wymogów regulacyjnych dotyczących logowania i przechowywania danych
  • Dokumentowania aktywności sieciowej na potrzeby audytów
  • Generowania raportów dla zarządu i osób odpowiedzialnych za zgodność
  • Demonstrowania należytej staranności w monitoringu bezpieczeństwa

Jak działa moduł (na wysokim poziomie)

Moduł jest zoptymalizowany pod kątem dużych plików i przetwarza dzienniki debugowania DNS do ustrukturyzowanego formatu CSV. Obsługuje rekordy wieloliniowe (np. bloki szczegółów PACKET i wcięte linie kontynuacji), dzięki czemu komunikaty zdarzeń/diagnostyczne oraz szczegóły pakietów pozostają przypisane do właściwego rekordu.

Kluczowe możliwości:

  • Parsuje natywne pola dziennika debugowania DNS i generuje spójny układ CSV
  • Obsługuje wiele wersji serwera DNS (od 2012 R2 do 2025)
  • Wspiera PowerShell Desktop (5.1+) oraz Core (7.x)
  • Przetwarza pliki dowolnej wielkości (testowano na plikach 100MB+)
  • Waliduje nagłówki plików dziennika, aby zapewnić integralność danych
  • Generuje opcjonalne podsumowania statystyczne
  • Obsługuje przetwarzanie wsadowe przez potok PowerShell
  • Opcjonalnie kompresuje pliki wyjściowe, oszczędzając miejsce na dysku
  • Może automatycznie usuwać pliki źródłowe po pomyślnym przetworzeniu
  • Uwzględnia ustawienia kulturowe przy parsowaniu dat dla międzynarodowych dzienników DNS
  • Uwzględnia ustawienia kulturowe przy formatowaniu dat dla międzynarodowych wymagań wyjściowych

Licencjonowanie i wsparcie

Moduł jest udostępniony na licencji MIT. Wsparcie społecznościowe dostępne jest przez GitHub Issues.

2 - Formaty wyjściowe

DNSServer.DebugLogParser może generować dwa typy wyjścia:

  • Plik danych CSV zawierający wszystkie przetworzone wpisy
  • Opcjonalne pliki statystyk do agregacji dziennej

Aby zobaczyć przykłady każdego typu wyjścia w praktyce, sprawdź przykład w tym artykule.

Plik danych CSV

Przykładowe pliki wyjściowe:

Plik danych CSV zawiera wszystkie przetworzone wpisy dziennika z następującymi kolumnami:

  • DateTime: Data i czas zapytania/odpowiedzi DNS
  • ThreadId: Wewnętrzny identyfikator wątku serwera DNS
  • Context: Kontekst operacji (na przykład Packet, Event, Note, DSPoll, Init, Lookup, Recurse, Remote, Tombstone)
  • PacketId: Identyfikator pakietu DNS
  • Protocol: UDP lub TCP
  • Direction: Rcv (odebrane/zapytanie) lub Snd (wysłane/odpowiedź)
  • ClientIP: Adres IP klienta
  • Xid: Identyfikator transakcji (hex)
  • Type: Zapytanie lub odpowiedź
  • Opcode: Standard, Notify, Update lub Unknown
  • FlagsHex: Flagi zapytania/odpowiedzi (hex)
  • FlagsChar: Zdekodowane flagi (Authoritative, Truncated, RecursionDesired, RecursionAvailable)
  • ResponseCode: NOERROR, NXDOMAIN, SERVFAIL itd.
  • QuestionType: Typ rekordu DNS (A, AAAA, MX, PTR itd.)
  • QuestionName: Nazwa domeny zapytanej
  • Information: Dodatkowe informacje (dla Event/Note/itp.; dla bloków szczegółów pakietu zawiera linię nagłówka szczegółów TCP/UDP)
  • Details: Dane JSON dla wpisów Packet zawierających bloki szczegółów (puste w przeciwnym razie)
  • ComputerName: Nazwa serwera źródłowego (zawsze obecna; pusta jeśli nie określona)

Uwaga: Kolumna ComputerName jest zawsze dołączana na końcu każdego rekordu, aby zapewnić spójną strukturę wyjścia. Ułatwia to scenariusze konsolidacji dzienników z wielu serwerów.

Pliki statystyk (opcjonalne)

Przykładowe pliki wyjściowe:

Gdy generowane są statystyki, tworzone są dwa oddzielne pliki:

1) Statystyki kontekstu (*_Statistic.csv)

Kolumny:

  • Date: Data (yyyy-MM-dd)
  • Context: Nazwa kontekstu (na przykład Packet, Event, Note)
  • Count: Liczba rekordów
  • ComputerName: Nazwa serwera źródłowego

2) Statystyki pakietów (*_PacketStatistic.csv)

Kolumny:

  • Date: Data (yyyy-MM-dd)
  • ClientIP: Adres IP klienta
  • Protocol: UDP lub TCP
  • Direction: Rcv lub Snd
  • QuestionType: Typ rekordu DNS
  • Count: Liczba rekordów
  • ComputerName: Nazwa serwera źródłowego

3 - Najlepsze praktyki operacyjne

Podczas korzystania z DNSServer.DebugLogParser w środowisku produkcyjnym:

  1. Zaplanuj regularne przetwarzanie

    • Użyj Harmonogramu zadań, aby automatycznie konwertować nowe pliki dziennika codziennie lub co tydzień.
  2. Odpowiednio rotuj dzienniki

    • Dzienniki debugowania DNS mogą szybko rosnąć; skonfiguruj rotację przy rozsądnym rozmiarze (na przykład 100MB).
  3. Waliduj wynik

    • Zweryfikuj kilka pierwszych przekonwertowanych plików przed pełną automatyzacją.
  4. Zaplanuj wymagania dotyczące przechowywania

    • Nawet z kompresją, zaplanuj miejsce na dysku bazując na wolumenie DNS i okresie przechowywania.
  5. Zabezpiecz dane wrażliwe

    • Dzienniki DNS mogą zawierać wrażliwe dane; chroń wyniki odpowiednimi kontrolami dostępu.
  6. Dokumentuj swój proces

    • Dokumentuj harmonogramy przetwarzania, lokalizacje przechowywania i sposób wykorzystania analiz.
  7. Testuj na plikach przykładowych

    • Zweryfikuj parametry i format wyjścia przed przetwarzaniem krytycznych dzienników.
  8. Monitoruj błędy

    • Obserwuj uszkodzone dzienniki, problemy z dostępem lub niewystarczającą ilość miejsca na dysku.

4 - Rozwiązywanie problemów

Najczęstsze problemy i rozwiązania

„Plik nie jest prawidłowym plikiem dziennika debugowania DNS”

  • Upewnij się, że konwertujesz rzeczywisty dziennik debugowania serwera DNS.
  • Plik powinien zaczynać się od Message logging started at lub zawierać wpisy zapytań DNS.
  • Jeśli jesteś pewien, że plik jest prawidłowy, ale nagłówek się różni, użyj -SkipHeaderValidation.

Plik wyjściowy jest pusty lub niekompletny

  • Potwierdź, że plik wejściowy zawiera prawidłowe wpisy dziennika.
  • Niektóre dzienniki mogą zawierać tylko informacje nagłówkowe, jeśli nie wystąpiły zapytania.
  • Sprawdź, czy plik dziennika nie jest uszkodzony i zawiera rzeczywiste dane zapytań.

Przetwarzanie jest bardzo wolne

  • Upewnij się, że masz wystarczającą ilość pamięci i dysk nie jest mocno obciążony.
  • Rozważ przetwarzanie mniejszych plików dziennika.
  • Rozważ użycie -CompressOutput z zaplanowanym przetwarzaniem, aby obsługiwać mniejsze partie.

Błędy „Access denied”

  • Uruchom PowerShell z odpowiednimi uprawnieniami do odczytu źródłowych plików dziennika i zapisu do katalogu docelowego.
  • Pliki dziennika DNS mogą wymagać uprawnień administratora.

Skompresowany plik wyjściowy jest większy niż oczekiwano

  • Dzienniki z wieloma unikalnymi wartościami kompresują się mniej efektywnie; może to być normalne.
  • Kompresja ZIP zazwyczaj nadal zapewnia znaczne zmniejszenie rozmiaru.

Plik statystyk nie odpowiada oczekiwaniom

  • Sprawdź, czy używasz -OutputType Both lub -OutputType Statistic.
  • Statystyki to zagregowane liczby (grupowanie dzienne), więc wartości reprezentują sumy.

Zgłaszanie problemów

Jeśli napotkasz problemy nieopisane tutaj:

  1. Sprawdź, czy używasz najnowszej wersji modułu.
  2. Przejrzyj Issues na GitHub pod kątem podobnych problemów.
  3. Zbierz informacje diagnostyczne:
    • wersja PowerShell ($PSVersionTable)
    • wersja modułu (Get-Module DNSServer.DebugLogParser)
    • przykładowy plik dziennika (jeśli to możliwe)
    • pełny komunikat o błędzie i ślad stosu
  4. Otwórz nowe zgłoszenie na GitHub z tymi szczegółami.

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

5.1 - Convert-DNSDebugLogFile

SYNOPSIS

Przekształca dzienniki debugowania serwera DNS Windows do strukturalnego formatu CSV do analizy i raportowania.

SYNTAX

__AllParameterSets

Convert-DNSDebugLogFile [-InputFile] <string[]> [[-OutputFile] <string>] [[-Delimiter] <string>]
 [[-ComputerName] <string>] [[-OutputType] <string>] [[-ContextFilter] <string[]>]
 [[-InputCulture] <cultureinfo>] [[-OutputCulture] <cultureinfo>] [-SkipHeaderValidation]
 [-RemoveSourceFile] [-CompressOutput] [-NoDetailsParsing] [-WhatIf] [-Confirm] [<CommonParameters>]

ALIASES

Ten cmdlet ma następujące aliasy,

DESCRIPTION

Konwertuje pliki dzienników debugowania serwera DNS Windows na strukturalne 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 w formacie CSV do analizy. Wynik CSV zawiera 18 kolumn, w tym kolumnę Information z tekstem zdarzenia/diagnostycznym, opcjonalną kolumnę JSON Details dla bloków szczegółów pakietu oraz zawsze obecna kolumnę ComputerName (pusta, jeśli nie podano wartości).

KLUCZOWE CECHY:

  • Wysoka wydajność parsowania zoptymalizowana pod kątem dużych plików (100MB+)
  • Konfigurowalny separator CSV (domyślnie średnik)
  • Opcjonalne podsumowania statystyczne z agregowanymi metrykami
  • Filtrowanie kontekstu (Pakiet, Zdarzenie, Notatka i inne) do skupienia się na określonych typach wpisów
  • Parsowanie i formatowanie dat uwzględniające kulturę dla serwerów międzynarodowych
  • Obsługa potoku do przetwarzania wsadowego wielu plików
  • Opcjonalna kompresja plików wyjściowych (format ZIP)
  • Opcjonalne automatyczne usuwanie plików źródłowych po przetworzeniu
  • Walidacja nagłówka dla zapewnienia integralności danych

FORMAT WYJŚCIA: Kolumna ComputerName jest zawsze dołączana na końcu każdego rekordu. Jeśli parametr -ComputerName nie jest podany, kolumna pozostanie pusta. Zapewnia to spójną strukturę wyjścia w scenariuszach konsolidacji z wielu serwerów.

WYDAJNOŚĆ: Zoptymalizowano przy użyciu StreamReader/StreamWriter z buforami 64KB, operacji na stringach zamiast regex, ręcznej generacji CSV oraz efektywnego zbierania statystyk na bazie hashtable.

KOMPATYBILNOŚĆ:

  • PowerShell 5.1+ (edycje Desktop i Core)
  • Windows Server 2016+
  • Format dzienników serwera DNS 2012 R2 do 2025

EXAMPLES

PRZYKŁAD 1

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

Konwertuje dziennik debugowania DNS z ustawieniami domyślnymi (zarówno pliki danych, jak i statystyk z separatorem średnik). Wynik:

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

PRZYKŁAD 2

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

Generuje tylko plik danych bez statystyk. Wynik: C:\Logs\dns.csv

PRZYKŁAD 3

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

Generuje tylko pliki statystyk z agregowanymi metrykami. Wynik:

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

PRZYKŁAD 4

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

Konwertuje dziennik do niestandardowej lokalizacji wyjściowej. Wynik: C:\Output\parsed.csv

PRZYKŁAD 5

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

Konwertuje z separatorem przecinka i dodaje kolumnę ComputerName z wartością “DNS01”. Wynik:

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

PRZYKŁAD 6

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

Wsadowe przetwarzanie wielu plików dzienników debugowania DNS przez potok. Wynik: Dla każdego pliku .log generuje pliki .csv i _statistic.csv

PRZYKŁAD 7

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

Konwertuje i kompresuje wynik do archiwum ZIP. Wynik: C:\Logs\dns.zip (zawierający dns.csv + pliki statystyk)

PRZYKŁAD 8

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

Konwertuje dziennik i usuwa plik źródłowy po pomyślnym przetworzeniu. Szczegółowy output 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.YYYY) i wyprowadza w formacie amerykańskim (MM/DD/YYYY). Użyj podczas przetwarzania dzienników z serwerów o różnych ustawieniach regionalnych.

PRZYKŁAD 10

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

Konwertuje tylko wpisy pakietów zapytań/odpowiedzi DNS, wykluczając wpisy EVENT i Note. Użyj, aby skupić analizę na rzeczywistym ruchu DNS.

PRZYKŁAD 11

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

Konwertuje zarówno pakiety zapytań/odpowiedzi DNS, jak i zdarzenia serwera, wykluczając wpisy Note i inne. Użyj, aby analizować ruch 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 dla 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żyj, gdy przetwarzasz bardzo duże pliki i nie potrzebujesz szczegółowej analizy struktury pakietów.

PARAMETERS

-CompressOutput

Kompresuje pliki CSV wyjściowe do archiwum ZIP po ich utworzeniu.

Tworzy plik .zip zawierający wygenerowane pliki CSV, a następnie usuwa niekompresowane pliki CSV. Plik ZIP jest tworzony w tym samym katalogu co plik CSV z tą samą nazwą bazową.

Korzyści:

  • Znacząco zmniejsza zajętość dysku (pliki CSV zwykle kompresują się o 90%+)
  • Upraszcza zarządzanie plikami i archiwizację
  • Nadaje się do długoterminowego przechowywania

Przykład: Plik wejściowy ‘dns.log’ generuje ‘dns.csv’, który jest kompresowany do ‘dns.zip’, a następnie ‘dns.csv’ jest usuwany.

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

-ComputerName

Określa wartość dla kolumny ComputerName w wyjściowym pliku CSV. Kolumna ComputerName jest zawsze obecna w wyjściu – jeśli parametr nie jest podany, kolumna pozostanie pusta.

Używaj tego przy konsolidacji dzienników z wielu serwerów DNS, aby zidentyfikować serwer źródłowy w połączonych zestawach danych.

Uwaga: To NIE jest parametr zdalnego wywołania. Cmdlet przetwarza tylko pliki lokalne.

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

-Confirm

Pyta o potwierdzenie przed uruchomieniem cmdletu.

Jeśli podany, pyta o potwierdzenie przed:

  • Przetwarzaniem każdego pliku dziennika debugowania DNS
  • Usunięciem plików źródłowych (gdy użyto -RemoveSourceFile)
  • Nadpisaniem 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 (główne dane)
  • EVENT: Zdarzenia serwera DNS (np. “Serwer DNS został uruchomiony.”)
  • Note: Notatki diagnostyczne i ostrzeżenia (np. błędy gniazda, stany wewnętrzne)
  • DSPoll, Init, Lookup, Recurse, Remote, Tombstone: Dodatkowe typy kontekstu

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: Podaj 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 będą zawierać 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ściowego pliku 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 oddzielonych 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 lokalizacji Windows na serwerze, na którym dziennik został wygenerowany. Użyj tego parametru podczas przetwarzania dzienników z serwerów o różnych ustawieniach regionalnych.

Domyślnie: bieżąca kultura

Popularne przykłady:

  • ‘de-DE’ lub ‘de-AT’: format niemiecki (DD.MM.YYYY lub DD/MM/YYYY)
  • ’en-US’: format amerykański (MM/DD/YYYY z AM/PM)
  • ’en-GB’: format brytyjski (DD/MM/YYYY z czasem 24-godzinnym)
  • ‘sv-SE’: format szwedzki/ISO (YYYY-MM-DD)
Type: CultureInfo
DefaultValue: '[System.Globalization.CultureInfo]::CurrentCulture'
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 6
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-InputFile

Określa ścieżkę do pliku dziennika debugowania DNS do parsowania. Obsługuje tablice do przetwarzania wielu plików.

Akceptuje dane z potoku od 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 strukturalnego formatu JSON.

Jeśli podany, rekordy PACKET z blokami szczegółów będą miały linię info TCP/UDP w kolumnie Information, ale kolumna Details pozostanie pusta. To znacznie poprawia wydajność przetwarzania dużych plików dzienników, gdy szczegółowa analiza struktury pakietu nie jest potrzebna.

Użyj tego przełącznika gdy:

  • Przetwarzasz bardzo duże pliki dzienników (100MB+) i potrzebujesz tylko podstawowych informacji o zapytaniach
  • Nie wymagasz szczegółowej struktury (flagi wiadomości, sekcje DNS) do analizy
  • Priorytetem jest maksymalna szybkość parsowania nad kompletnością danych

Wpływ na wydajność: Może przyspieszyć przetwarzanie 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żyj tego, gdy pliki CSV będą używane przez aplikacje lub systemy z określonymi ustawieniami regionalnymi.

Domyślnie: bieżąca kultura

Popularne przykłady:

  • ’en-US’: format amerykański (MM/DD/YYYY)
  • ‘de-DE’: format niemiecki (DD.MM.YYYY)
  • ‘sv-SE’ lub InvariantCulture: format ISO (YYYY-MM-DD) dla maksymalnej kompatybilności
Type: CultureInfo
DefaultValue: '[System.Globalization.CultureInfo]::CurrentCulture'
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 7
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-OutputFile

Określa ścieżkę do wyjściowego pliku CSV. Jeśli nie podano, 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 sparsowanymi wpisami dziennika
  • ‘Statistic’: Generuje tylko pliki statystyk z agregowanymi metrykami
  • ‘Both’: Generuje zarówno pliki danych, jak i statystyk (domyślnie)

Domyślnie: Both

Gdy generowane są statystyki, tworzone są dwa oddzielne pliki:

  • ‘_Statistic.csv’: Podsumowanie liczby wpisów według typu kontekstu na dzień (Data, Kontekst, Liczba, ComputerName)
  • ‘_PacketStatistic.csv’: Szczegółowe liczniki PACKET na dzień według IP klienta, protokołu, kierunku i typu zapytania (Data, ClientIP, Protokół, Kierunek, TypZapytania, Liczba, ComputerName)
Type: String
DefaultValue: Both
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 4
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

-RemoveSourceFile

Usuwa źródłowy plik dziennika debugowania DNS po pomyślnym przetworzeniu.

Używaj tego w automatycznych potokach przetwarzania dzienników lub do zarządzania miejscem na dysku. Plik źródłowy jest usuwany tylko, jeśli przetwarzanie zakończy się sukcesem i wszystkie pliki wyjściowe zostaną utworzone.

Bezpieczeństwo: Nie można używać z -SkipHeaderValidation, aby zapobiec przypadkowemu usunięciu nieprawidłowych plików.

Ostrzeżenie: Pliki źródłowe są trwale usuwane. Upewnij się, że pliki wyjściowe są poprawne przed użyciem tej opcji.

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

-SkipHeaderValidation

Pomija sprawdzanie poprawności nagłówka dziennika debugowania DNS.

Domyślnie cmdlet weryfikuje, czy pliki wejściowe mają poprawny nagłówek dziennika debugowania serwera DNS. Użyj tego przełącznika, aby przetwarzać pliki bez walidacji, co może być przydatne dla:

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

Jeśli podany, wyświetla szczegółowe informacje o operacjach, które zostałyby wykonane, bez faktycznego ich wykonania. Przydatne do:

  • Podglądu, które pliki zostałyby przetworzone
  • Weryfikacji ścieżek plików wyjściowych przed przetwarzaniem
  • Testowania skryptów przed uruchomieniem w środowisku produkcyjnym
Type: SwitchParameter
DefaultValue: ''
SupportsWildcards: false
Aliases:
- wi
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''

CommonParameters

Ten cmdlet obsługuje parametry wspólne: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction i -WarningVariable. Więcej informacji znajdziesz w about_CommonParameters.

INPUTS

System.String[]

NOTES

Wersja : 1.7.0.0 Autor : Andi Bellstedt, Copilot Data : 2026-01-25 Słowa kluczowe : Microsoft Windows Server, DNSServer, DNS, DebugLog, LogParser

6 - 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ń.

6.1 - Przepływ pracy analizy bezpieczeństwa z SQL Server

Konwertuj dzienniki debugowania DNS na CSV za pomocą DNSServer.DebugLogParser, importuj wynik do SQL Server i uruchom proste zapytanie wykrywające podejrzaną aktywność rekordów TXT.

Ten przykład pokazuje praktyczny przepływ pracy dla analityki bezpieczeństwa: analizuje dziennik debugowania DNS za pomocą Convert-DNSDebugLogFile, importuje wygenerowany plik CSV do SQL Server i uruchamia zapytanie, które wyróżnia nietypowo dużą liczbę zapytań o rekordy TXT.

Dla najlepszej interoperacyjności ten przykład zapisuje znaczniki czasu w formacie podobnym do ISO, używając -OutputCulture 'sv-SE'.

Wymagane moduły

Ten przykład korzysta z następujących modułów PowerShell:

  • DNSServer.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.

6.2 - Praktyczne zastosowanie w środowisku domenowym (zbieranie i konwersja sterowana przez GPO)

Ten przykład pokazuje, jak wdrożyć przepływ pracy sterowany przez GPO do zbierania i konwersji dzienników debugowania DNS na kontrolerach domeny.

Ten dokument przedstawia praktyczny, kompleksowy przykład uruchomienia DNSServer.DebugLogParser w środowisku domeny Active Directory, skupiając się na konwersji dzienników debugowania serwera DNS Windows na kontrolerach domeny.

Do tego przykładu dołączony jest archiwum ZIP, które zawiera artefakty polityki używane do wdrożenia opisanego tutaj przepływu pracy.
Najważniejsze artefakty to manifest kopii zapasowej, raport GPO, Files.xml, Set-DNSServerDebugLogging.ps1 oraz ScheduledTasks.xml.

Scenariusz

  • Kilka kontrolerów domeny (DC) pełni rolę serwera DNS.
  • Debugowanie DNS jest włączone i spójnie skonfigurowane na każdym DC za pomocą zadania zaplanowanego (zapisujące pliki dziennika do C:\Administration\Logs\DNSServer).
  • Centralnie zarządzany proces konwertuje dzienniki na CSV do celów:
    • analizy bezpieczeństwa
    • raportowania operacyjnego
    • rozwiązywania problemów
    • zgodności/przechowywania danych

Docelowe rezultaty

  • Spójne ustawienia konwersji na wszystkich DC
  • Przewidywalna lokalizacja i nazewnictwo plików wyjściowych
  • Opcjonalna kompresja zmniejszająca zajętość miejsca
  • Opcjonalne statystyki do szybkich podsumowań dziennych
  • Minimalne ryzyko po stronie hosta, z wyraźnymi zasadami ponownego uruchomienia i czyszczenia

Proponowana architektura

Model zbierania: lokalna konwersja + centralne pobieranie

  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 są zapisywane obok plików dziennika, aby uprościć potok.
  4. Centralny serwer zbiera pliki *.zip, na przykład przez udostępnianie plików, zaplanowane kopiowanie, przekazywanie do SIEM lub kolektor oparty na agencie.

Ten model minimalizuje odczyty sieciowe dużych surowych plików dziennika i utrzymuje analizę blisko danych.

Przepływ pracy GPO

Przepływ pracy jest realizowany przez Politykę Grupową (konfiguracja komputera), aby zapewnić spójne ustawienia na wszystkich kontrolerach domeny.

Referencyjna implementacja zawarta w tym repozytorium (raport GPO):

  • Nazwa archiwum/raportu: T0-C-Analytics-DNSDebugLogging
  • ID kopii zapasowej: {2B6F16BC-0E7C-4787-83D7-2854FED882EE}
  • Cel linku GPO: corp.company.com/Domain Controllers
  • Filtr elementów (używany zarówno do wdrożenia plików, jak i zadań zaplanowanych): stosowany tylko jeśli istnieje C:\Windows\System32\dns.exe

1) Wymagania wstępne (foldery + moduł)

Dostarczona kopia zapasowa zakłada, że te foldery już istnieją. Dodaj osobne elementy GPP, jeśli chcesz, aby wdrożenie tworzyło je automatycznie:

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

Kopia zapasowa zakłada również, że Convert-DNSDebugLogFile jest już dostępny na DC. Zadanie konwersji uruchamia Windows PowerShell 5.1 z -NoProfile i nie importuje modułu jawnie, więc moduł musi być zainstalowany w ścieżce modułów Windows PowerShell widocznej dla LocalSystem. Zalecane podejścia:

  • Zainstaluj DNSServer.DebugLogParser na DC, np. z PowerShell Gallery (jeśli polityka na to pozwala).
  • Wdróż moduł przez wewnętrzne repozytorium / udział plików, aby był wykrywalny w $env:PSModulePath
  • Dodaj jawny Import-Module do akcji zadania, jeśli chcesz mieć deterministyczne ładowanie

2) Wdrożenie skryptu konfigurującego debugowanie DNS (GPP Files)

GPO wdraża skrypt:

  • Źródło (w SYSVOL przez GPP): %GptPath%\Preferences\Files\Set-DNSServerDebugLogging.ps1
  • Cel (na każdym DC): C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1

Jest to zaimplementowane w elemencie preferencji GPP Files w Files.xml.

3) Zadanie zaplanowane: konfiguracja debugowania DNS

GPO tworzy zadanie zaplanowane o nazwie Set-DNSServerDebugLogging.

  • Kontekst bezpieczeństwa w dostarczonej kopii zapasowej: SYSTEM z typem logowania S4U
  • Wyzwalacz w dostarczonej kopii zapasowej: codziennie (start 2025-03-01T00:00:01)
  • Akcja w ScheduledTasks.xml:
    • powershell.exe -ExecutionPolicy RemoteSigned -command " & { C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1 }"
    • Katalog roboczy: C:\Administration\Scripts

Powiązany skrypt Set-DNSServerDebugLogging.ps1 konfiguruje debugowanie DNS za pomocą Get-DnsServerDiagnostics / Set-DnsServerDiagnostics i (co ważne):

  • Włącza logowanie do pliku + przełączanie plików
  • Zapisuje do: C:\Administration\Logs\DNSServer\DnsDebugLog_<COMPUTERNAME>.<Domain>_.log
  • Ustawia rozmiar przełączania na 10 MB na plik
  • Rejestruje głównie aktywność związaną z zapytaniami (zapytania + powiadomienia + aktualizacje + transakcje zapytań) i wyklucza pełne logowanie pakietów

4) Zadanie zaplanowane: konwersja obróconych dzienników debugowania do skompresowanego CSV

GPO tworzy zadanie zaplanowane o nazwie Convert-DNSDebugLogs.

  • Kontekst bezpieczeństwa w dostarczonej kopii zapasowej: SYSTEM z typem logowania InteractiveToken
  • Wyzwalacz w dostarczonej kopii zapasowej: codziennie (start 2026-01-01T00:30:00)
  • Katalog roboczy: C:\Administration\Logs\DNSServer
  • Akcja w ScheduledTasks.xml (formatowana dla czytelności):
Get-ChildItem .\*.log |
  Sort-Object lastwritetime, Name -Descending |
  Select-Object -Skip 1 |
  Convert-DNSDebugLogFile `
    -ComputerName $env:COMPUTERNAME `
    -Delimiter ';' `
    -OutputType Both `
    -ContextFilter Packet `
    -OutputCulture sv-SE `
    -CompressOutput

Uwagi projektowe:

  • Select-Object -Skip 1 celowo pomija najnowszy (aktywny) plik dziennika.
  • Oznacza to, że bieżące dane są eksportowane dopiero po przełączeniu; na DC o niskim natężeniu ruchu aktywny dziennik może pozostać nieprzetworzony przez ponad dzień.
  • Ponieważ Convert-DNSDebugLogFile domyślnie ustawia -OutputFile na „ten sam folder, ta sama nazwa, .csv”, wyniki trafiają obok plików *.log.
  • Z -CompressOutput każdy przetworzony dziennik generuje *.zip, a pośrednie CSV są usuwane.
  • Jeśli nie archiwizujesz ani nie usuwasz przetworzonych plików *.log, kolejne uruchomienia będą ponownie przetwarzać każdy nieaktywny dziennik.
  • Zadanie zgłasza błąd, jeśli $Error.Count -gt 0, sygnalizując nieudane uruchomienie.

5) Centralne pobieranie

Opcje (wybierz jedną):

  • Pobieranie przez udział plików: DC zapisuje (lub kopiuje) C:\Administration\Logs\DNSServer\*.zip do \\fileserver\share\dns\$env:COMPUTERNAME\... (przyznaj prawa do udziału i NTFS kontom komputerów DC lub grupie Domain Controllers, jeśli zadanie działa jako SYSTEM)
  • Model pull: centralne zadanie odczytuje \\dc\C$\Administration\Logs\DNSServer\*.zip (najmniej preferowane; wymaga udziałów administracyjnych)
  • Agent forwarder: SIEM / potok logów przesyłający pliki *.zip

Rozważania operacyjne

  • Zasada najmniejszych uprawnień: zadania działają jako SYSTEM; upewnij się, że lokalne foldery są zapisywalne i że dowolne cele UNC przyznają dostęp kontu komputera, jeśli są używane.
  • Polityka podpisywania: oba zadania używają -ExecutionPolicy RemoteSigned; podpisz lub odblokuj wdrożony skrypt i moduł zgodnie z polityką.
  • Wykorzystanie dysku: -CompressOutput znacząco pomaga, ale ten przepływ pracy nie usuwa źródłowych dzienników; zaplanuj retencję i czyszczenie.
  • Zachowanie ponownego przetwarzania: jeśli nie archiwizujesz ani nie usuwasz przetworzonych dzienników, zadanie konwersji będzie ponownie przetwarzać każdy nieaktywny plik *.log podczas kolejnych uruchomień. To proste i niezawodne, ale może nadpisać wyniki i tworzyć duplikaty w dalszym przetwarzaniu, jeśli kolektor nie deduplikuje.
  • Konsolidacja wielu DC: -ComputerName $env:COMPUTERNAME jest dołączone, aby zestawy danych pozostały możliwe do śledzenia.
  • Walidacja: walidacja nagłówka pozostaje włączona, ponieważ zadanie nie używa -SkipHeaderValidation (zalecane).

Walidacja i dostosowanie (z użyciem ZIP)

Użyj archiwum ZIP jako implementacji referencyjnej, a następnie dostosuj następujące aspekty do swojego środowiska:

  • Zakres docelowy: które DC / OU otrzymują politykę
  • Tożsamość wykonania: potwierdź, że oba zadania zaplanowane używają zamierzonego typu logowania (S4U vs InteractiveToken) lub ujednolić je do swojego standardu
  • Tworzenie folderów: zdecyduj, czy C:\Administration\Scripts i C:\Administration\Logs\DNSServer są przygotowane gdzie indziej, czy mają być tworzone przez dodatkowe elementy GPP
  • Ścieżki: potwierdź, że C:\Administration\Scripts i C:\Administration\Logs\DNSServer odpowiadają twoim standardom
  • Retencja: zdecyduj, czy zachować surowe dzienniki i na jak długo (szczególnie jeśli włączasz opcje czyszczenia)
  • Pobieranie: potwierdź, gdzie zapisywane są pliki CSV/ZIP i jak są centralnie zbierane

Jeśli chcesz zweryfikować dokładną konfigurację GPO bez importowania, autorytatywne źródła w tym repozytorium to:

6.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"