DHCP Filter Replication über PowerShell

Eine Synchronisation des DHCPs über mehrere Domain Controller erfolgt automatisch. Durch das die Filter des DHCPs hiervon nicht betroffen sind, muss der Abgleich manuell erfolgen.

Das Skript wird auf dem zu aktualisierenden System ausgeführt – alle Filter werden entfernt und dann mit den Daten des Masters aktualisiert.

Aufruf

Update-Impeo-DHCPFilterSync -SystemName DC02 *> "C:\PowerShell\Update-DHCPFilterSync.log" -SendEMailSuccess $true
# PowerShell DHCP Filter Replication
#
# (c) C:Amie 2014, Siegfried Paul
function Update-DHCPFilterSync{
    # .SYNOPSIS Aktualisierung des DHCP-Filters .DESCRIPTION Eine Synchronisation des DHCPs über mehrere Domain Controller erfolgt automatisch. Durch das die Filter des DHCPs hiervon nicht betroffen sind, muss der Abgleich manuell erfolgen. Das Skript wird auf dem zu aktualisierenden System ausgeführt - alle Filer werden entfernt und dann mit den Daten des Masters aktualisiert. .PARAMETER SystemName Name des Sysetms auf dem es ausgefuehrt wird. Parameter ist hilfreich wenn fehler auftreten. .PARAMETER SendEMailSuccess Wird der Parameter $true mit uebergeben und der Durchlauf ist erfolgreich wird eine positive E-Mail versendet. Im Standard ist der Wert $false belegt Es koennen die Parameter $true oder $false uebergeben werden. .PARAMETER EMailTo Die Empfaenger-Adresse fuer einen erfolgreichen und fehlerhaften Durchlauf. Im Standard ist der Wert mit der Adresse mail@mail.de belegt. .PARAMETER MasterServerHostname Hier handelt es sich um den DHCP-Master. Mit diesen Daten wird das lokale System aktualisiert. Im Standard ist DC01.dccontroller.de hinterlegt .PARAMETER ScopeId Hier handelt es sich um das lokale System. Dieses System wird aktualisiert. Im Standard ist 10.10.10.1 hinterlegt .EXAMPLE Update-Impeo-DHCPFilterSync -SystemName [Systemname] Im Standard wird bei einem Fehlerfall eine E-Mail versendet. Zur Identifizierung des Systems bei einem Fehlerfall sollte dieser Parameter mit übergeben werden. .EXAMPLE Update-Impeo-DHCPFilterSync -SendEMailSuccess $true Aktualisiert alle Systeme mit Mail-Versand des erfolgreichen Durchlaufs .EXAMPLE Update-Impeo-DHCPFilterSync -EMailTo $true Aktualisiert alle Systeme mit Mail-Versand des erfolgreichen Durchlaufs #>
    # Uebergabeparameter
    PARAM(
        [String][Parameter(Mandatory=$false,HelpMessage="Name des Systems")]$SystemName = "System unbekannt",
        [String][Parameter(Mandatory=$false,HelpMessage="E-Mail Empfaengeradresse")]$EMailTo = "admin@sps-schweers.de",
        [Bool][Parameter(Mandatory=$false,HelpMessage="E-Mail Versand bei erfolgreicher ausfuehrung")]$SendEMailSuccess = $false,
        [String][Parameter(Mandatory=$false,HelpMessage="DHCP Master")]$MasterServerHostname = "DC01.dccontroller.de",
        [String][Parameter(Mandatory=$false,HelpMessage="Lokales, zu aktualisierendes System")]$ScopeId = "10.10.10.1"
    )
    # Konsolenausgabe
    $Text = Get-Date
    "Start - $Text"
    # Catch - Mail-Variable
    $EMailFrom = "mail@mail.de"
    $EMailServer = "smtp.mail.de"
    $EMailPort = 25
    $SystemInfoText = "System unbekannt"
    $MailSubject = "Sync DHCP Filter - $Systemname"
    # Master pruefen
    $Text = "Master pruefen"
    # Konsolenausgabe
    $Text
    if(!(Test-Connection -Cn $MasterServerHostname -BufferSize 16 -Count 1 -ea 0 -quiet)){
        $FailedItem = $_.Exception.StackTrace
        $ErrorMessage = $_.Exception.Message
        $Text = "$Text`r`nFehler-Message: Das System $MasterServerHostname ist nicht erreichbar .`r`n"
        $MailSubject = "Error - $MailSubject"
        # Konsolenausgabe
        $Text
        Send-MailMessage -From $EMailFrom -To $EMailTo -Subject $MailSubject -SmtpServer $EMailServer -Port $EMailPort -Body $Text
        Break
    }
    try{
        # Get the LOCAL filters from localhost
        $Text = "Get the LOCAL filters from localhost"
        # Konsolenausgabe
        $Text
        $lfilters = Get-DhcpServerv4Filter
        # Get the REMOTE filters from $MasterServerHostname
        $Text = "Get the REMOTE filters from $MasterServerHostname"
        # Konsolenausgabe
        $Text
        $rfilters = invoke-command -computername $MasterServerHostname { Get-DhcpServerv4Filter }
        if ($rfilters) {
            # Stop the DHCP Scope on the LOCAL server from leasing
            $Text = "Stop the DHCP Scope on the $ScopeId server from leasing"
            # Konsolenausgabe
            $Text
            Set-DhcpServerv4Scope -ScopeId $ScopeId -State "Inactive"
            # Delete the local Filter Set
            $Text = "Delete the local Filter Set"
            # Konsolenausgabe
            $Text
            ForEach ($filter in $rfilters) {
                Remove-DhcpServerv4Filter -MacAddress $filter.MacAddress
            }
            # Import the new Filter Set
            $Text = "Import the new Filter Set"
            # Konsolenausgabe
            $Text
            ForEach ($filter in $rfilters) {
                write-host $filter.List
                write-host $filter.MacAddress;
                write-host $filter.Description
                Add-DhcpServerv4Filter -List $filter.List -MacAddress $filter.MacAddress -Description $filter.Description
            }
        }
        # Start the DHCP Scope on the LOCAL server
        $Text = "Start the DHCP Scope on the LOCAL server"
        # Konsolenausgabe
        $Text
        Set-DhcpServerv4Scope -ScopeId $ScopeId -State "Active"
    }
    catch{
        $FailedItem = $_.Exception.StackTrace
        $ErrorMessage = $_.Exception.Message
        $Text = "$Text`r`nFehler-StackTrace: $FailedItem`r`n Fehler-Message: $ErrorMessage`r`n"
        $MailSubject = "Error - $MailSubject"
        # Konsolenausgabe
        $Text
        Send-MailMessage -From $EMailFrom -To $EMailTo -Subject $MailSubject -SmtpServer $EMailServer -Port $EMailPort -Body $Text
        Break
    }
    $Text = "Synchronisation der Filter wurde erfolgreich durchgefuehrt"
    # Konsolenausgabe
    $Text
    # Mailversand bei erfolgreicher ausfuehrung
    if($SendEMailSuccess -eq $true){
        $FailedItem = $_.Exception.StackTrace
        $ErrorMessage = $_.Exception.Message
        $MailSubject = "Success - $MailSubject"
        Send-MailMessage -From $EMailFrom -To $EMailTo -Subject $MailSubject -SmtpServer $EMailServer -Port $EMailPort -Body $Text
        Break
    }
}

Weitere Links
PowerShell Skript signieren
PowerShell Funktionen global bereitstellen
PowerShell Module über Taskmanager starten

Eine Antwort schreiben