DNSAge

VBScript und 64Bit !
Viele 32bit COM-Objekte lassen sich auf einem 64bit System nur instanziieren, wenn die 32bit Version von CSCRIPT/WSCRIPT genutzt wird, welcher unter C:\Windows\SysWOW64\cscript.exe liegt.

Auf der Seite DNS finden Sie eine recht umfangreiche Beschreibung zur Funktion und Konfiguration von Windows DNS-Servern im Active Directory. Sie sollten auf dieser Seite zumindest das Kapitel DNS_Alterung lesen, welches die Grundlagen für diese Seite bildet.

Systeme können sich per "dynamischem DNS" auch im Active Directory selbst ein und austragen. Dies ist eine sehr bequeme Möglichkeit, wie Clients und Server immer die aktuellen Daten bereit stellen können, ohne dass Sie als Administrator aktiv werden müssen. Über "Sichere Updates" kann sogar ein System nur seine eigenen Einträge verändern und nur dem Active Directory bekannte Systeme (Computerkonto) kann Einträge addieren.

Aber auch wenn sich Systeme beim Herunterfahren wieder austragen, bleiben oftmals ein paar Altsysteme registriert, die es schon lange nicht mehr gibt. Manchmal blockieren Sie sogar DNS-Einträge (z.B.: PTR-Records). Daher können Windows DNS-Server eine Aufräumfunktion, die alte Einträge nach einiger Zeit löscht. Diese ist aber per Default nicht aktiv.

Und hier kommt DNSAge zum Einsatz. DNSAge löst folgende Probleme:

  • Wie alt sind welche Einträge ?
    Das Skript erfragt vom DNS-Server die Einträge einer oder aller Zonen und gibt deren Alter (in Minuten) und Zeitstempel (erzeugt, geändert) aus. Damit können Sie DNSAge auch einfach nur als Hilfsmittel einer Auswertung verwenden. Eine entsprechende Funktion fehlt in der MMC zur DNS-Verwaltung komplett.
  • Welche Einträge würden beim Aufräumen gelöscht ?
    Mit dem Alter bezogen auf den Timestamp der letzten Aktualisierung können Sie gut erkennen, welche Einträge durch den DNS-Server gelöscht werden, wenn Sie Scavening mit bestimmten Verfallszeiten aktivieren.
  • Wie kann ich manuell Einträge mit Protokoll löschen ?
    Wenn Sie lieber nicht den DNS-Server im Hintergrund Systeme löschen lassen wollen, dann kann DNSAge ihnen auch diese Arbeit abnehmen. Die einfache Version löscht einfach alle Einträge, die älter als eine einstellbare Zeit sind.

Das Skript ist in der vorliegenden Version komplett funktionsfähig. Interessant wären Natürlich noch einige weitere Funktion z.B. eine Gegenprüfung zu einem Computerkonto im Active Directory Forest. So könnten dynamische Einträge sofort entfernt werden, wenn das Computerkonto nicht mehr existiert. Umgekehrt könnte ein Eintrag, der lange nicht mehr im DNS aktualisiert wurde, auch ein löschen des Computerkontos anstoßen.

Technische Hintergründe

Ich habe einige Zeit gesucht, und zuerst per LDAP versucht, das Alter von DNS-Einträgen in Erfahrung zu bringen. Wie Sie vielleicht wissen, sind die DNS-Einträge bei einer Active Directory integrierten Zone (Meine Empfehlung beim Einsatz von DNS unter Windows), Bestandteil des Active Directory und per LDAP erreichbar. In einer eigenen Partition finden Sich die Einträge:

DNS im Active Directory

Ein Export der Active Directory integrierten Zonen per LDAP ist nicht hilfreich, da die wichtige Daten im Feld "dnsRecord" codiert enthalten sind. Um nicht allzu viel Zeit mit der Decodierung von binären Daten zu verlieren, habe ich weiter gesucht und bin bei WMI fündig geworden. Die komplette DNS-Konfiguration und auch auf die Einträge sind per WMI erreichbar.

DNS per PowerShell ausgeben

Um sie etwas neugierig auf "PowerShell" zu machen, habe ich hier ein paar Musterzeilen beschrieben, mit denen Sie zumindest die Export-Funktion direkt auf der PowerShelll Kommandezeile ausführen können:

REM Auslesen der zonen auf dem Server SRV01

Get-WmiObject -ComputerName SRV01 -Namespace 'root\MicrosoftDNS' -Class MicrosoftDNS_Zone | Select Name

REM Ausgabe der MSXFAQ.DE Zone

Get-WmiObject -ComputerName SRV01 -Namespace 'root\MicrosoftDNS' -Class MicrosoftDNS_Zone -Filter 'Name = "msxfaq.de"'

Wenn man nun weiß, dass PowerShell extrem objektorientiert arbeiten, dann kann man hier Natürlich noch weiter ansetzen und Einträge und ganze Zonen löschen und ergänzen.

VBScript-Lösung

Da nun die meisten Administratoren mit PowerShell noch nicht viel gemacht haben und selbst das Schreiben eines VBScript bei dem ein oder anderen schon Schweißausbrüche verursacht, habe ich ihnen ein DNSAGE.VBS hier zum Download bereit gestellt.

dnsage.1.4.vbs
Datei speichern und Erweiterung nach VBS umbenennen.

Per Default liest das Skript alle Einträge des lokalen Servers und gibt diese auf dem Bildschirm aus. Daher sollte der Aufruf mit CSCRIPT in einer DOS-Box erfolgen. Wer die Ausgabe als Datei haben will, sollte die Ausgabe einfach umleiten und z.B. mit Excel als CSV-Datei öffnen.

cscript dnsage.vbs

cscript dnsage.vbs > dnsliste.csv

Das Skript erfragt drei Parameter, die mit ungefährlichen Standardwerten vorbelegt sind.

  • Server
    Geben Sie bitte den DNS-Server an. Per Default wird der lokale Server (".") gefragt. Bei der Abfrage entfernter Server benötigen Sie administrativen Zugriff auf den Server per WMI
  • Domain
    Optional können Sie die DNS-Zone angeben, die Sie auslesen wollen. Bleibt der String leer (Default), dann werden alle Zonen des Servers ausgegeben.
  • maximales Alter
    Der Default 0 sorgt dafür, dass keine Elemente gelöscht werden. Wenn Sie hier eine Zahl ungleich 0 eingeben, dann wird diese als maximales Alter in Minuten gewertet und alle älteren Einträge werden gelöscht.

Um das Risiko einer irrtümlichen Löschung auszuschließen, habe ich den Löschbefehl selbst im Skript noch auskommentiert. Damit etwas gelöscht wird, müssen Sie den Code auf Zeit 48 wieder aktivieren.

Wer mag, kann die Abfragen im Skript Natürlich durch feste Zuweisungen ersetzen.

Weitere Links