1 - Ajoitetun tehtävän esimerkki
Tämä esimerkki näyttää, miten luodaan Windowsin ajoitettu tehtävä, joka suorittaa PowerShell-skriptin DNS-vianmäärityslokien käsittelemiseksi päivittäin.
Tämä skripti luo Windowsin ajoitetun tehtävän, joka suoritetaan päivittäin klo 2:00. Se tuo moduulin ja käsittelee kaikki lokitiedostot kansiossa, jossa skripti suoritetaan (tässä esimerkissä “C:\Administration\Logs\DNS”). Prosessi pakkaa tuloksen ZIP-tiedostoiksi ja poistaa alkuperäiset tiedostot siisteyden ylläpitämiseksi.
$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"
2 - Käytännön käyttö toimialueympäristössä (GPO-ohjattu kokoelma ja muunnos)
Tämä esimerkki näyttää, miten toteuttaa GPO-ohjattu työnkulku DNS-vianmäärityslokien keräämiseen ja muuntamiseen toimialueen ohjaimilla.
Tässä dokumentissa esitellään käytännön, päästä päähän -esimerkki DNSServer.DebugLogParserin ajamisesta Active Directory -toimialueympäristössä, keskittyen Windows DNS Serverin vianmäärityslokien muuntamiseen toimialueen ohjaimilla.
Tämän esimerkin mukana on ZIP-arkisto, joka sisältää politiikka-artifaktit työnkulun toteuttamiseen.
Merkittävimmät artifaktit ovat varmuuskopion manifesti, GPO-raportti, Files.xml, Set-DNSServerDebugLogging.ps1 ja ScheduledTasks.xml.
Tilannekuvaus
- Useat toimialueen ohjaimet (DC) isännöivät DNS-palvelinroolia.
- DNS-vianmääritysloki on otettu käyttöön ja konfiguroitu johdonmukaisesti jokaisella DC:llä ajastetun tehtävän avulla (lokitiedostot tallennetaan polkuun
C:\Administration\Logs\DNSServer). - Keskitetysti hallittu prosessi muuntaa lokit CSV-muotoon seuraaviin tarkoituksiin:
- tietoturva-analytiikka
- operatiivinen raportointi
- vianetsintä
- vaatimustenmukaisuus ja säilytys
Tavoitteet
- Johdonmukaiset muunnosasetukset kaikilla DC:illä
- Ennustettava tulostuspaikka ja nimeäminen
- Valinnainen pakkaus tallennustilan säästämiseksi
- Valinnaiset tilastotulosteet nopeisiin päivittäisiin yhteenvedonäkymiin
- Minimiriskit isäntäpuolella, selkeät uudelleenkäynnistys- ja siivouskäytännöt
Suositeltu arkkitehtuuri
Keräysmalli: paikallinen muunnos + keskitetty haku
- Jokainen DC kirjoittaa DNS-vianmäärityslokit levylle rollover-ominaisuus päällä.
- Jokainen DC muuntaa kiertävät
*.log-tiedostot data-CSV:ksi ja tilastotiedostoiksi, ja pakkaa tulokset *.zip-muotoon ajastetusti (Task Scheduler). - Tulosteet kirjoitetaan lokitiedostojen viereen, jotta putki pysyy yksinkertaisena.
- Keskitetty palvelin kerää
*.zip-tulosteet esimerkiksi tiedostojakojen kautta, ajastetulla kopioinnilla, SIEM-välityksellä tai agenttipohjaisella kerääjällä.
Tämä malli minimoi suurten raakalukujen verkon lukemisen ja pitää jäsentämisen lähellä dataa.
GPO-työnkulku
Työnkulku toteutetaan ryhmäkäytännön (Group Policy, tietokoneen asetukset) avulla, jotta asetukset ovat yhdenmukaiset kaikilla toimialueen ohjaimilla.
Tämän repositorion mukana tulee viiteimplementaatio (GPO-raportti):
- Arkisto-/raporttinimi:
T0-C-Analytics-DNSDebugLogging - Varmuuskopion tunniste:
{2B6F16BC-0E7C-4787-83D7-2854FED882EE} - GPO-linkin kohde:
corp.company.com/Domain Controllers - Kohdesuodatin (käytetään sekä tiedostojen käyttöönotossa että ajastetuissa tehtävissä): soveltuu vain, jos
C:\Windows\System32\dns.exe on olemassa
1) Esivaatimukset (kansiot + moduuli)
Toimitettu varmuuskopio olettaa, että seuraavat kansiot ovat jo olemassa. Lisää erilliset GPP-kohteet, jos haluat, että käyttöönotto luo ne automaattisesti:
C:\Administration\ScriptsC:\Administration\Logs\DNSServer
Varmuuskopio olettaa myös, että Convert-DNSDebugLogFile on jo saatavilla DC:illä. Muunnostyö käynnistää Windows PowerShell 5.1:n -NoProfile-asetuksella eikä tuo moduulia eksplisiittisesti, joten moduulin on oltava asennettuna konekohtaisessa Windows PowerShell -moduulipolussa, joka on näkyvissä LocalSystem-tilille. Suositellut tavat:
- Asenna DNSServer.DebugLogParser DC:ille, esimerkiksi PowerShell Gallerysta (jos politiikka sallii).
- Ota moduuli käyttöön sisäisen repositorion tai tiedostojakopalvelimen kautta, jotta se löytyy
$env:PSModulePath-polusta. - Lisää eksplisiittinen
Import-Module tehtävän toimintaan, jos haluat varmistaa latauksen deterministisesti.
2) Ota käyttöön vianmäärityslokin konfigurointiskripti (GPP Files)
GPO ottaa käyttöön skriptin:
- Lähde (SYSVOLin kautta GPP):
%GptPath%\Preferences\Files\Set-DNSServerDebugLogging.ps1 - Kohde (jokaisella DC:llä):
C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1
Tämä on toteutettu GPP Files -asetuskohteena Files.xml-tiedostossa.
3) Ajastettu tehtävä: konfiguroi DNS-vianmääritysloki
GPO luo ajastetun tehtävän nimeltä Set-DNSServerDebugLogging.
- Turvakonteksti toimitetussa varmuuskopiossa:
SYSTEM kirjautumistyyppi S4U - Laukaisin toimitetussa varmuuskopiossa: päivittäin (aloitusraja
2025-03-01T00:00:01) - Toiminto ScheduledTasks.xml-tiedostossa:
powershell.exe -ExecutionPolicy RemoteSigned -command " & { C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1 }"- Työhakemisto:
C:\Administration\Scripts
Linkitetty Set-DNSServerDebugLogging.ps1-skripti konfiguroi DNS-vianmäärityslokin komentoja Get-DnsServerDiagnostics / Set-DnsServerDiagnostics käyttäen ja erityisesti:
- Ottaa käyttöön lokituksen tiedostoon + rolloverin
- Kirjoittaa tiedostoon:
C:\Administration\Logs\DNSServer\DnsDebugLog_<COMPUTERNAME>.<Domain>_.log - Käyttää 10 Mt:n rollover-kokoa per tiedosto
- Tallentaa pääasiassa kyselyihin liittyvää toimintaa (kyselyt + ilmoitukset + päivitykset + kyselytapahtumat) ja sulkee pois täydellisen pakettitason lokituksen
4) Ajastettu tehtävä: muunna kiertävät vianmäärityslokit pakatuiksi CSV-tiedostoiksi
GPO luo ajastetun tehtävän nimeltä Convert-DNSDebugLogs.
- Turvakonteksti toimitetussa varmuuskopiossa:
SYSTEM kirjautumistyyppi InteractiveToken - Laukaisin toimitetussa varmuuskopiossa: päivittäin (aloitusraja
2026-01-01T00:30:00) - Työhakemisto:
C:\Administration\Logs\DNSServer - Toiminto ScheduledTasks.xml-tiedostossa (muotoiltu luettavuuden vuoksi):
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
Suunnittelumuistiinpanot:
Select-Object -Skip 1 jättää tietoisesti käsittelemättä uusimman (aktiivisen) lokitiedoston. Convert-DNSDebugLogFile pystyy lukemaan lokin, jonka DNS Server on tällä hetkellä auki, mutta tiedosto muuttuu lukemisen aikana: tuloste voi jäädä puutteelliseksi tai päättyä katkaistuun tietueeseen, ja kaksi ajoa eivät tuota identtisiä tuloksia. Aktiivisen tiedoston ohittaminen pitää ajastetun tulosteen toistettavana.- Tämä tarkoittaa, että nykyiset tiedot viedään vain rolloverin jälkeen; pienemmällä kuormituksella DC:llä aktiivinen loki voi jäädä käsittelemättä yli päivän. Pienennä rollover-kokoa, jos viive on liian pitkä käyttötapaukseesi.
- Koska Convert-DNSDebugLogFile käyttää oletuksena
-OutputFile-asetusta “sama kansio, sama nimi, .csv”, tulosteet sijoittuvat *.log-tiedostojen viereen. -CompressOutput-asetuksella jokainen käsitelty loki tuottaa *.zip-tiedoston ja väliaikaiset CSV:t poistetaan.- Ellet arkistoi tai poista käsiteltyjä
*.log-tiedostoja, myöhemmät ajot käsittelevät kaikki ei-aktiiviset lokit uudelleen. - Tehtävä heittää virheen, jos
$Error.Count -gt 0, merkiksi epäonnistuneesta ajosta.
5) Keskitetty keräys
Vaihtoehdot (valitse yksi):
- Tiedostojakojen keräys: DC kirjoittaa (tai kopioi)
C:\Administration\Logs\DNSServer\*.zip polkuun \\fileserver\share\dns\$env:COMPUTERNAME\... (myönnä jakamisoikeudet ja NTFS-oikeudet DC:n tietokoneen tileille tai Domain Controllers -ryhmälle, jos tehtävä ajetaan SYSTEM-tilillä) - Haku-malli: keskitetty työ lukee
\\dc\C$\Administration\Logs\DNSServer\*.zip (vähiten suositeltu; vaatii hallintajakamiset) - Agentin välitys: SIEM- tai lokiputki, joka lähettää
*.zip-tulosteet
Käyttöön liittyvät huomioitavat asiat
- Vähimmän oikeuden periaate: tehtävät ajetaan
SYSTEM-tilillä; varmista, että paikalliset kansiot ovat kirjoitettavissa ja että UNC-kohteet myöntävät pääsyn tietokoneen tilille, jos niitä käytetään. - Allekirjoituspolitiikka: molemmat tehtävät käyttävät
-ExecutionPolicy RemoteSigned; allekirjoita tai poista estot käyttöön otetusta skriptistä ja moduulista politiikkasi mukaisesti. - Levyn käyttö:
-CompressOutput auttaa merkittävästi, mutta tämä työnkulku ei poista lähdelokeja; suunnittele säilytys ja siivous. - Uudelleenkäsittely: ellet arkistoi tai poista käsiteltyjä lokitiedostoja, muunnostyö käsittelee kaikki ei-aktiiviset
*.log-tiedostot uudelleen myöhemmillä ajoilla. Tämä on yksinkertaista ja luotettavaa, mutta voi ylikirjoittaa tulosteita ja aiheuttaa kaksoiskeräystä, jos kerääjä ei poista duplikaatteja. - Usean DC:n yhdistäminen:
-ComputerName $env:COMPUTERNAME sisältyy, jotta yhdistetyt aineistot pysyvät jäljitettävinä. Huomaa, että -ComputerName vain merkitsee tulosteen — se ei tee etäyhteyttä. - Verkkotiedostojako: Convert-DNSDebugLogFile pystyy lukemaan lähdelokit SMB/UNC-poluilta, mutta paikallinen muunnos ja pakattujen tulosten lähetys on parempi malli suurille raakalukuille. Jos käytät UNC-polkuja, muista, että
SYSTEM-tilillä ajettava tehtävä todentaa verkossa tietokoneen tilinä ja tarvitsee jakamis- ja NTFS-oikeudet. - Päivämäärämuoto:
-OutputCulture sv-SE on valittu tarkoituksella, jotta aikaleimat kirjoitetaan muodossa 2026-01-20 23:00:16. Tämä muoto tunnistetaan ilman vihjettä SQL Serverissä, Power BI:ssä ja useimmissa tuontityökaluissa, riippumatta DC:n paikallisesta asetuksesta. - Validointi: otsikkotarkistus on päällä, koska tehtävä ei käytä
-SkipHeaderValidation-asetusta (suositeltavaa).
Varmista ja mukauta (ZIP:n avulla)
Käytä ZIP-arkistoa viiteimplementaationa ja sovita seuraavat asiat ympäristöösi:
- Kohdealue: mitkä DC:t / OU:t saavat politiikan
- Suoritusidentiteetti: varmista, että molemmat ajastetut tehtävät käyttävät haluttua kirjautumistyyppiä (
S4U vs InteractiveToken) tai yhdenmukaista ne standardiisi - Kansioiden luonti: päätä, luodaanko
C:\Administration\Scripts ja C:\Administration\Logs\DNSServer etukäteen muualla vai GPP-kohteilla - Polut: varmista, että
C:\Administration\Scripts ja C:\Administration\Logs\DNSServer vastaavat standardeja - Säilytys: päätä, säilytetäänkö raakalokitus ja kuinka pitkään (erityisesti, jos siivousvaihtoehdot otetaan käyttöön)
- Keräys: varmista, mihin CSV/ZIP-tulosteet kirjoitetaan ja miten ne kerätään keskitetysti
Jos haluat tarkistaa tarkan GPO-konfiguraation ilman tuontia, tämän repositorion auktoritatiiviset lähteet ovat:
3 - SQL Server -tietokannan turvallisuusanalyysityönkulku
Muunna DNS-vianmäärityslokit CSV-muotoon DNSServer.DebugLogParserilla, tuo tulos SQL Serveriin ja suorita yksinkertainen havaitsemiskysely epäilyttävälle TXT-tietueiden toiminnalle.
Tässä esimerkissä näytetään käytännön työnkulku turvallisuusanalytiikkaan: jäsennä DNS-vianmääritysloki Convert-DNSDebugLogFile-komennolla, tuo luotu CSV SQL Serveriin ja suorita kysely, joka korostaa epätavallisen suuria TXT-tietueiden hakumääriä.
Parhaan yhteensopivuuden varmistamiseksi tämä esimerkki kirjoittaa aikaleimat ISO-tyyppisessä muodossa käyttämällä -OutputCulture 'sv-SE'.
Tarvittavat moduulit
Tämä esimerkki käyttää seuraavia PowerShell-moduuleja:
DNSServer.DebugLogParserSqlServer
Asenna ne tarvittaessa:
Install-Module -Name DNSServer.DebugLogParser -Scope CurrentUser
Install-Module -Name SqlServer -Scope CurrentUser
Tilanne
Käytä tätä työnkulkua, kun haluat siirtää jäsenneltyjä DNS-vianmäärityslokitietoja SQL Serveriin, jotta voit:
- hakea suuria tietoaineistoja tehokkaasti
- rakentaa toistettavia havaitsemiskyselyjä
- korreloida toimintaa useiden DNS-palvelimien välillä
- säilyttää normalisoidut tiedot myöhempää tutkimusta varten
Muunnosvaiheen tulos
Convert-DNSDebugLogFile ei kirjoita suoraan SQL Serveriin. Se luo ensin CSV-tiedoston. Tämä CSV-tiedosto on tietoaineisto, joka tuodaan tietokantaan.
Tässä esimerkissä:
- syöttöloki:
C:\Administration\Logs\DNS\dns.log - luotu CSV:
C:\Administration\Logs\DNS\dns.csv - kohdetaulu:
dbo.DNSQueries
Luo kohdetietokanta
Suorita seuraava lause SQL Serverissä kerran luodaksesi kohdetietokannan.
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;
Muunna loki ja tuo CSV
Seuraava PowerShell-esimerkki suorittaa koko työnkulun:
- tuo tarvittavat moduulit
- muuntaa DNS-vianmäärityslokin CSV-muotoon
- lataa luodun CSV:n
- tuo rivit eräajona SQL Serveriin
# 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 "The generated CSV file '$csvPath' does not contain any rows."
}
$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()
}
Kysely epäilyttävälle TXT-tietueiden toiminnalle
Kun tiedot ovat SQL Serverissä, voit hakea asiakkaita, jotka tekevät epätavallisen suuren määrän TXT-tietuehakukyselyjä.
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;
Jos haluat suorittaa kyselyn PowerShellistä, käytä Invoke-Sqlcmd-komentoa SqlServer-moduulista:
$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
Miksi TXT-kyselyt ovat kiinnostavia
TXT-tietueiden hakujen suuri määrä voi olla tarkastelun arvoista, koska se voi viitata:
- DNS-tunnelointiin
- tietojen ulosvuotoon DNS:n kautta
- TXT-tietueiden väärinkäyttöön haittaohjelmien tai työkalujen toimesta
- epätavallisen meluisiin tai virheellisesti konfiguroituihin asiakkaisiin
Tämä kysely on vain lähtökohta. Tuotantoympäristössä sinun tulisi säätää kynnysarvoa ja lisätä suodattimia, jotka sopivat omaan ympäristöösi.
Käyttöhuomautuksia
Import-Csv lukee koko tiedoston muistiin. Erittäin suurten lokitiedostojen kanssa kannattaa harkita virtaavaa käsittelyä täyden DataTablen rakentamisen sijaan.- Säilytä
-ComputerName muunnosvaiheessa, jotta tietueet voidaan edelleen yhdistää lähteeseen keskitetyn tuonnin jälkeen. - Käytä yhtenäistä erotinta ja kulttuuria vienti- ja tuontivaiheissa.
- Varmista säilytys, indeksointi ja käyttöoikeudet SQL Serverissä ennen tämän työnkulun käyttämistä pitkäaikaiseen tallennukseen.