Freitag, 18. Oktober 2013

DHCP Bereiche mittels Group Policy überwachen

Jeder DHCP-Bereich umfasst eine definierte Anzahl an IP-Adressen. 
Ist dieser Bereich erschöpft, so können keine weiteren Adressen mehr vergeben werden. Das passiert meistens dann, wenn man am wenigsten damit rechnet.
Für den User hat das den unschönen Effekt, dass der Client zwar mit dem Netzwerk verbunden ist, aber aufgrund der fehlenden IP-Adresse nicht mit den anderen Clients / Servern kommunizieren kann.

Das MMC-Snapin
Der Microsoft DHCP-Server notiert dies im DHCP Snapin mit verschiedenen Warnsymbolen. Eine Liste aller Symbole incl. ihrer Bedeutung findet ihr hier:

http://technet.microsoft.com/en-us/library/cc784812%28v=ws.10%29.aspx


Diese Warnsymbole kann man leicht übersehen. Hat man nicht ständig das DHCP-Snapin geöffnet, wird man im Zweifelsfalle nicht sehen, dass ein
DHCP-Bereich erschöpft ist.



Event 1020 - an Ereignisse geknüpfte Aktionen
Zusätzlich zur Snapin Warnung wird im Eventlog ein Eintrag protokolliert.
Dieser Eintrag hat die ID 1020.

Diese Events können ab Windows Vista bzw. Server 2008 abonniert werden. 
Eine ebenfalls neue Methode seit 2008 ist das Verknüpfen von Aktionen mit Events. Verknüpft man die Aktion "E-Mail senden" mit dem Event 1020, wird jedes Mal beim Auslösen dieses Events eine Mail gesendet.

Wir erhalten eine Mail sobald ein Bereich eine gewisse Schwelle an benutzten Adressen überschreitet, wissen jedoch noch nicht um welchen Bereich es sich handelt. Bei einem DHCP-Server mit vielen Bereichen ist diese Information nicht sehr hilfreich.

PowerShell Skript

Die Aktion die an das Event geknüpft ist, kann auch die Ausführung eines Programms / Befehls sein. Wenn das passende Skript vorhanden ist, können umfangreichere Informationen verarbeitet werden.

$eventList = @()
Get-EventLog -LogName System -After (get-date).AddHours(-1) -Source DhcpServer -InstanceId 1020 | where-object  {$_.Message -notlike "*10.110*"}
| foreach-Object {
$row = "" | Select ScopeAddress, Utilization, FreeIPAddresses
$row.ScopeAddress = $_.ReplacementStrings[0]
$row.Utilization= $_.ReplacementStrings[1]
$row.FreeIPAddresses = $_.ReplacementStrings[2]
$eventList += $row
$FoundEvent="True"
}

$messageParameters = @{
Subject = "DHCP Scope Utilisation Report " + $env:COMPUTERNAME + " - $((Get-Date))"
Body = $eventList | Sort Utilization -Descending |
ConvertTo-Html |
Out-String
From = "DHCP-ALERT@domain.com"
To = "dhcp-alert@domain.com"
SmtpServer = "MAILSERVER"
}

if ($FoundEvent -eq "True")
{
    Send-MailMessage @messageParameters -BodyAsHtml
}


Das Skript führt eine Abfrage auf das System Eventlog durch.
Es werden alle Ereignisse mit der ID 1020 der letzten Stunde ausgelesen.

Diese Events werden dann per Mail an die angegebene Adresse gesendet.

Um nach Bedarf Bereiche auszuschließen, habe ich das Skript etwas modifiziert.
Bereiche (bzw. Textpassagen im Detailtext des Events) können in dieser Zeile vom Mailversand ausgeschlossen werden:

where-object  {$_.Message -notlike "*10.110*"}


In diesem Falle werden also alle Events ausgeschlossen, die "10.110" im Detailtext des Events enthalten.
 
Konfiguration per Gruppenrichtlinie verteilen
Wir haben nun gelernt, dass wir Aktionen an Ereignisse binden können.
Wir haben auch das dazugehörige Skript um diese Informationen per E-Mail zu versenden. Diese Lösung muss manuell an jedem DHCP-Server konfiguriert werden. Nun kommt das Thema Gruppenrichlinien ins Spiel.

Mit einer Kombination aus verschiedenen Group Policy Preferences und Item Level Targetings lässt sich diese Lösung ganz schnell und einfach an alle DHCP-Server verteilen.

Hier die Schritte die dafür nötig sind:

1. Schritt - GPO
Eine neue GPO erstellen

2. Schritt - Hilfsvariable
Um nicht ständig die Registry abzufragen, erstellen wir uns eine Hilfsvariable.
In diesem Falle "ISDHCPSERVER".




Damit die Variable nur bei den DHCP-Server auf "TRUE" gesetzt wird, müssen wir ein Item Level Targeting (Zielgruppenadressierung) verwenden. 
In diesem Falle wird der Starttyp des Dienstes "DHCPServer" abgefragt.
Genau genommen ist dies natürlich noch keine Garantie dass auf dem Server ein Adresspool angelegt und aktiviert ist. In der Regel ist dies jedoch der Fall.

Es können natürlich auch andere ILT verwendet werden.




Bei jedem DHCP-Server der diese Kriterien erfüllt, wird also fortan die Variable "ISDHCPSERVER" erstellt und auf "TRUE" gesetzt.
Damit dies wieder rückgängig gemacht wird (falls z.B. die DHCP Rolle deinstalliert wird), müssen wir diese Option noch aktivieren:



3. Schritt - Kopieren des Skripts
Als nächstes müssen wir das Skript auf jeden zutreffenden Server kopieren.
Das lässt sich ebenfalls mittels Group Policy Preferences realisieren.
Wir nutzen also GPP Files.



Hier verwenden wir die Hilfvariable als Targeting.



4. Schritt - Anlegen der geplanten Aufgabe




Zusätzlich verwenden wir hier das ILT auf die Variable "ISDHCPSERVER" und aktivieren die Option "Element entfernen, wenn es nicht mehr angewendet wird".

Hier noch der Inhalt der Batchdatei "dhcpreport.bat"

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe Set-ExecutionPolicy RemoteSigned
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "C:\Batch\dhcpreport.ps1"

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe Set-ExecutionPolicy Restricted

5. Schritt - Einstellen der Warnschwelle 
Per Default wird das Event ab einer Bereichsauslastung von 80 % erzeugt.
Dieser Threshold kann mit einem Registryschlüssel geändert werden.
Auch hier verwenden wir wieder das gleiche ILT und die genannte Option zum Entfernen der Einstellung.


  
Die genannte DHCP Überwachung in Kombination mit GPP funktioniert erst ab Windows Server 2008 R2.