Windows 10 Templates installieren und verwalten

logoWindows 10 Templates installieren und verwalten

Microsoft hat nun auch, um Windows 10 und Server 2016 über Gruppenrichtlinien vernünftig verwalten zu können, die passenden Templates herausgebracht.

Die Templates für Windows 10 und 1511 findet Ihr hier

Das Template für Windows 10 1607 und Server 2016 findet Ihr hier

Wie man die Templates installiert zeige ich im nächsten Artikel.

Exchange Powershell Smtpadresse an anderes Postfach übertragen

logoExchange Powershell Smtpadresse an anderes Postfach übertragen

Hintergrund: In kleinen wie auch großen Firmen kommt es vor, dass Mitarbeiter/innen das Unternehmen wechseln. Im normalen Fall wird das Active Directory Benutzerkonto und auch das Emailkonto deaktiviert oder gelöscht.
Dies hat den Nachteil, dass Kunden, welche noch nicht mitbekommen haben, dass der jeweilige Mitarbeiter/in das Unternehmen verlassen hat beim Versand einer Email eine unschöne Rückmeldung vom Exchangeserver erhalten (Emailkonto nicht vorhanden oder gefunden).

Für diesen Fall möchte ich gerne folgende Lösung vorschlagen: Alle SMTP Emailadressen des Mitarbeiters, welcher das Unternehmen verlassen hat werden an ein globales Postfach weitergeleitet. Das globale Postfach wiederrum antwortet dem jeweiligen Absender mit einer Abwesenheitsnacht (out of Office). Die Nachricht kann natürlich nicht speziell auf jeden ausgeschiedenen Benutzer angepasst werden, sondern beinhaltet einen allgemeinen Text, dass der Empfänger nicht mehr vorhanden ist und der Absender sich doch bitte an die jeweilige Zentrale des Unternehmens wenden möchte.

Dies funktioniert mit den folgenden Powershellscripts.

Script 1 macht folgendes: Der ausgeschiedene Mitarbeiter erhält über das Active Direktory eine Gruppe z.B. Ausgeschiedene Benutzer“. Das Script geht nun z.B. über einen regelmäßigen Task bei und ließt die Mitglieder der Gruppe aus. Befindet sich der Mitarbeiter dann noch in der Firma XYZ überträgt das Script die primäre SMTP Adresse an das hinterlegte globale Postfach. Zudem wird das Benutzerkonto deaktiviert.

# ————-Variables———————
$global_mailbox_name = „myglobalmailbox“
$group_name = „Ausgeschiedene Benutzer“
$company_name = „FIRMA XYZ“
# ——————————————-
# Load ActiveDirectory module
Import-Module ActiveDirectory

# determine Exchange server FQDN from AD
$exchange_server = Get-ADObject -LDAPFilter ‚objectClass=msExchExchangeServer‘ -SearchBase (([ADSI]“LDAP://RootDse“).configurationNamingContext.ToString()) -Properties networkaddress | select -Expand networkaddress | ?{$_ -match ’ncacn_ip_tcp‘} | %{$_.split(„:“)[1]} | select -First 1
if (!$exchange_server){Write-Host „Could not determine Exchange Server from AD“ -ForegroundColor Red; return}

# connect to exchange
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri „http://$exchange_server/powershell“ -Authentication Kerberos
Import-PSSession $session -DisableNameChecking -AllowClobber | out-null

# Get global mailbox
$global_mailbox = Get-Mailbox $global_mailbox_name

# iterate over all members of the group
Get-ADGroupMember $group_name | Get-ADUser -Properties Company | %{
$mbox = Get-Mailbox $_.SamAccountName -ErrorAction SilentlyContinue
if ($mbox){
# users primary mail address
$user_prim_address = $mbox.PrimarySmtpAddress.ToString()
# check if users mail address is already in global mailbox and if he is member of a specific company
if ($user_prim_address -notin $global_mailbox.EmailAddresses -and $_.Company -eq $company_name){
„Disabling mailbox of user ‚$($_.SamAccountName)‘ …“
$mbox | Disable-Mailbox -Confirm:$false
„Adding primary email address ‚$user_prim_address‘ to global mailbox.“
$global_mailbox | Set-Mailbox -EmailAddresses @{Add=$user_prim_address}
}
}
}

# close exchange session
Remove-PSSession $session

Script 2 geht noch einen ganzen Schritt weiter. Hier werden alle SMTP Emailadressen an ein globales Postfach übertragen. Selektiert wird hier zudem auch noch, wenn die Mitarbeiter in verschiedenen Firmen tätig sind. Zudem können dann mehrere globale Postfächer sortiert nach Firmen angegeben werden.

Die Frage die sich dann noch stellt ist, wie bekomme ich die übertragenen Adressen irgendwann wieder aus den globalen Postfächern wieder raus? Irgendwann möchte man die übertragenen Emailadressen ja auch wieder bereinigen. Auch hier prüft das Script via CSV Datei regelmäßig ab z.B. nach einem Monat und löscht so alte Adressen wieder aus den globalen Postfächern raus.

# ————-Variablen———————
# Gruppe in der die ausgeschiedenen Mitarbeiter gesammelt werden
$group_name = „Ausgeschiedene Benutzer“
# Zuordnung der Firmen zu globalen Postfächern
$company_mapping = @{
„DemoFirma“ = „myglobalmailbox1“
„DemoFirma2“ = „myglobalmailbox2“
„DemoFirma3“ = „myglobalmailbox2“
}
# Pfad für die CSV-Datei die den Status (Datum) der Mailadressen aufzeichnet
# um sie nach X Monaten entfernen zu können
$mail_expiration_file = ‚C:\mail_expiration.csv‘
# Entferne E-Mail Adressen nach Ablauf von X Monaten aus den globalen Postfächern
$mail_expiration_months = 6
# ——————————————-
# Load ActiveDirectory module
Import-Module ActiveDirectory

# Load Exchange environment
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn

# iterate over all members of the group
Get-ADGroupMember $group_name | Get-ADUser -Properties Company | %{
$mbox = Get-Mailbox $_.SamAccountName -ErrorAction SilentlyContinue
if ($mbox){
# Get global mailbox
$global_mailbox = Get-Mailbox $company_mapping[$_.Company] -EA SilentlyContinue
if ($global_mailbox){
# save users mail addresses into an array
$user_mail_addresses = $mbox.EmailAddresses.SmtpAddress

„Disabling mailbox of user ‚$($_.SamAccountName)‘ …“
$mbox | Disable-Mailbox -Confirm:$false
„Adding email addresses ‚$($user_mail_addresses -join ‚,‘)‘ to global mailbox ‚$($global_mailbox.Alias)'“
$global_mailbox | Set-Mailbox -EmailAddresses @{Add=$user_mail_addresses}
# Exporting mail addresses to csv file
$user_mail_addresses | %{[pscustomobject] @{Date=(get-date -F ‚d‘);’EMail’=$_;’GlobalMailbox’=$global_mailbox.Alias}} | export-csv $mail_expiration_file -Delimiter ‚;‘ -NoType -Encoding UTF8 -Append
}else{
Write-Error „The specified global mailbox for ‚$($_.Company)‘ does not exist.“
}
}
}

# check for expired mails in csv
if ((Test-Path $mail_expiration_file)){
$csv = Import-CSV $mail_expiration_file -Delimiter „;“
$expired_mails = $csv | ?{(get-date $_.Date) -lt (get-date).Date.AddMonths(-$mail_expiration_months)}
# if there are expired mail addresses
if ($expired_mails){
# remove expired addresses from their corresponding global mailbox
$expired_mails | group GlobalMailbox | %{
„Removing expired addresses ‚$($_.Group.EMail -join ‚,‘)‘ from global mailbox ‚$($_.Name)'“
Set-Mailbox $_.Name -EmailAddresses @{Remove=$_.Group.EMail}
}
# remove expired mails from csv
$csv | ?{$_.EMail -notin $expired_mails.EMail} | export-csv $mail_expiration_file -Delimiter ‚;‘ -NoType -Encoding UTF8
}
}

PRTG aktive Exchange DAG Datenbank überwachen

logoPRTG aktive Exchange DAG Datenbank überwachen

Warum will man eine aktive Datenbank in einer DAG überwachen? Ganz einfach, durch Fehler im System kann es zum Beispiel bei einem Aktive/Aktive Cluster dazu kommen, dass auf einmal ein Exchangeserver alle Datenbanken verwalten muss und damit die komplette Last abbekommt. Dies soll natürlich nicht so sein. Folgende Anleitung soll dabei helfen, einen Datenbankschwenk frühzeitig zu erkennen.

Wer seine aktive Datenbank in einer DAG per PRTG überwachen lassen will braucht in erster Linie erst einmal folgenden Sensor „Exchange Database“.

Meist wird dieser Sensor bei der automatischen Sensorensuche bereits automatisch für jede Datenbank hinzugefügt. Falls dies einmal nicht der Fall sein sollte, muss der Sensor pro Datenbank manuell hinzugefügt werden.

Im Sensor Exchange Database gibt es einen Channel „Active Copy“. Dieser Channel zeigt an auf welchem der in einer DAG enthaltenen Server die Datenbank zur Zeit aktiv ist.

Der Channel ansich gibt so allerdings noch keine Warnungen aus, da er bisher noch nicht weiß auf welchem Server in der DAG die entsprechende Datenbank denn aktiv sein soll.

Hierzu ist es notwendig einen „Value Lookup“ zu erstellen, welcher direkt im Channel hinterlegt werden muss.

PRTG01

Die Vorlage für einen Value Lookup schaut wie folgt aus:

<?xml version=“1.0″ encoding=“UTF-8″?>

<ValueLookup id=“exchangedag.activationstatus.Name des jeweiligen Exchangeservers“ desiredValue=“0″ xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance“ xsi:noNamespaceSchemaLocation=“PaeValueLookup.xsd“>

<Lookups>

<singleInt state=“Ok“ value=“0″>

active

</singleInt>

<singleInt state=“Warning“ value=“1″>

not active

</singleInt>

<singleInt state=“Warning“ value=“2″>

not active but this is the preferred server

</singleInt>

<singleInt state=“Warning“ value=“3″>

active but not on the preferred server

</singleInt>

</Lookups>

</ValueLookup>

 

Die Datei muss als „OVL“ Datei gespeichert werden.

Um das Lookup zu verwenden, gehen Sie wie folgt vor:

1) Speichern Sie die angehängte Datei unter auf dem PRTG Server unter „C:\Program Files (x86)\PRTG Network Monitor\lookups\custom“.

2) Öffnen Sie die PRTG Konsole oder den Webaufruf, dann den Reiter Setup | System Administration | Administrative Tools –> „Load Lookups“

3) Klicken Sie im DAG Sensor, der auf „Name des Exchangeservers“ liegt auf den „Active Copy“ Channel und wählen aus dem Dropdown nun das angepasste Lookup aus.

Sollte die Datenbank jetzt auf dem jeweiligen Server nicht aktiv sein, so wird eine Warnung rausgegeben und der Administrator kann weitere Schritte unternehmen.