Skip to main content

Skrypt wykonujący audyt wszystkich wpisów w DNS

Skrypt uruchamiamy jako Administrator w powershell, z zainstalowanymi przystawkami RSAT - DNS.

Skrypt zapisujący wyniki do pliku:
### Pobieranie argumentu adresu serwera DNS ###
if ($args.Count -eq 2) {
    $DnsServer = $args[0]
    $SavePath = $args[1]
} else {
    # Jeśli uruchomiono w ISE lub bez argumentów, prosi o wpisanie ręcznie
    Write-Host "Uruchom skrypt poprzez ./NazwaSkryptu.ps1 AdresSerweraDNS ŚcieżkaDoPliku.txt bądź podaj je teraz: "
    $DnsServer = Read-Host "Podaj adres serwera DNS"
    $SavePath = Read-Host "Podaj ścieżkę do zapisu"
}

# Sprawdzenie czy podano ścieżkę do zapisu
if (-not $SavePath) {
    Write-Host "Nie podano ścieżki do zapisu. Skrypt zostanie przerwany." -ForegroundColor Red
    exit
}

# Pobranie stref DNS z serwera
$Zones = @(Get-DnsServerZone -ComputerName $DnsServer)

ForEach ($Zone in $Zones) {
    # Wypisywanie strefy do konsoli i pliku
    Write-Host "`n$($Zone.ZoneName)" -ForegroundColor "Green"
    "`n$($Zone.ZoneName)" | Out-File -Append -FilePath $SavePath

    # Pobranie rekordów DNS w strefie i zapis do pliku
    Get-DnsServerResourceRecord -ComputerName $DnsServer -ZoneName $Zone.ZoneName | Out-File -Append -FilePath $SavePath
}

Write-Host "Zapis zakończony. Dane znajdują się w: $SavePath" -ForegroundColor Cyan

Przykładowe uruchomienie : 

image.png

image.png

image.png

Skrypt który każdą zone pokazuje w osobnym, interaktywnym oknie

Uwaga! Przy większej ilości zone w DNS może zająć dużo czasu przez przeklikanie się przez wszystkie okna

Okna otwierają się dopiero po zamknięciu poprzedniego

Add-Type -AssemblyName Microsoft.VisualBasic
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;

public class WinAPI {
    [DllImport("user32.dll")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);
}
"@ -Language CSharp

# Tworzenie formularza i ustawienie go na aktywne okno
[System.Windows.Forms.Application]::EnableVisualStyles()
$null = [System.Windows.Forms.Form]::new()

# Wyświetlenie okna dialogowego do wpisania adresu serwera DNS z instrukcją
$DnsServer = [Microsoft.VisualBasic.Interaction]::InputBox(
    "Podaj adres serwera DNS w formacie: serwer.domena.local`n`n⚠ UWAGA: Skrypt musi być uruchomiony na komputerze z zainstalowaną przystawką RSAT: DNS!`n`n ⚠ UWAGA: Skrypt otwiera nowe interaktywne okno dla każdej zony!",
    "Wprowadź adres DNS",
    "serwer.domena.local"
)

# Ustawienie okna na pierwszym planie po zamknięciu InputBox
$process = Get-Process | Where-Object { $_.MainWindowTitle -match "Wprowadź adres DNS" }
if ($process) {
    [WinAPI]::SetForegroundWindow($process.MainWindowHandle)
}

# Jeśli użytkownik nic nie wpisał i kliknął "Anuluj", skrypt się zatrzyma
if (-not $DnsServer) {
    Write-Host "Nie podano adresu serwera DNS. Skrypt zostanie zakończony." -ForegroundColor Red
    exit
}

# Pobranie stref DNS z serwera
$Zones = @(Get-DnsServerZone -ComputerName $DnsServer)

ForEach ($Zone in $Zones) {
    Write-Host "`n$($Zone.ZoneName)" -ForegroundColor "Green"
    
    # Pobranie rekordów DNS w strefie
    $records = Get-DnsServerResourceRecord -ComputerName $DnsServer -ZoneName $Zone.ZoneName 

    if ($records) {
        # Wymuszenie oczekiwania na zamknięcie Out-GridView przed otwarciem kolejnego
        $records | Out-GridView -Title "Rekordy DNS - $($Zone.ZoneName)" -PassThru | Out-Null
    } else {
        Write-Host "Brak rekordów w strefie $($Zone.ZoneName)" -ForegroundColor Yellow
    }
}

Write-Host "Koniec działania skryptu." -ForegroundColor Cyan

Przykładowe użycie:

Pytanie o serwer DNS

image.png

Interaktywne okno z wynikami

image.png