Search-Mailbox: Unerwünschte Mails aus Postfächern suchen/entfernen

Bei einer SPAM-Welle ist es eventuell nötig, dass bestimmte Mails direkt aus dem Postfach der Benutzer entfernt werden müssen. Dazu ist eine Abstimmung mit dem DSB nötig, da es hier um einen direkten Eingriff in die Postfächer geht. Außerdem ist ein sehr umsichtiger Umgang mit diesem Befehl nötig, da durch die Eingabe von fehlerhaften Parametern ganze Postfächer geleert werden können!
Zum Einsatz kommt hier das cmdlet Search-Mailbox, welches von Microsoft offiziell abgekündigt wurde. Dieses wurde offiziell durch das cmdlet New-ComplianceSearch ersetzt, wird aber immer noch onPrem und in der Cloud unterstützt.
Warum verwende ich trotzdem das alte cmdlet?
Da das New-ComplianceSearch keinen DELETE mehr zulässt, sondern nur noch suchen kann (Datenschutzkonform).
Gibt es Beschränkungen des cmdlets?
Search-Mailbox hat eine Begrenzung von 10.000 Ereignissen pro Postfach und muss ggf. mehrfach ausgeführt werden.
Quelle Microsofts Docs: Search-Mailbox (ExchangePowerShell) | Microsoft Docs
Damit man das cmdlet überhaupt ausführen darf sind die zwei folgenden Exchange-Administrator-Rollen für den AD-Benutzer, welches den Befehl ausführt, nötig:
Discovery Management
Exchange Mailbox Import Export

Das cmdlet hat drei Funktions-Modis:
LogOnly = Es wird nur ein Bericht erstellt, aber keine Mail gelöscht/verschoben
ohne Parameter = Es wird ein bericht erstellt und die gefundenen Mails werden in die TargetMailbox kopiert bleiben aber auch im originalen Postfach vorhanden
DeleteContent = Es wird ein bericht erstellt und die gefunden Mails werden in die Target;ailbox verschoben - die Mail ist im originalen Postfach NICHT mehr vorhanden

Der Bericht sieht dann wie folgt aus:

Beispiele
Beispiel 1 - Postfach durchsuchen und nur Bericht erstellen
Hier wird das Postfach von MMustermann durchsucht nach Mails mit dem Betreff "Virus" und Eingang am 07./08.02.2022. Es wird nur ein Bericht erstellt und keine Mails gelöscht oder kopiert. Der Bericht erfolgt an mailadmin@xyz.de im Ordner SPAM
Search-Mailbox -Identity MMustermann -TargetMailbox mailadmin@xyz.de -TargetFolder "SPAM" -SearchQuery {Subject:"Virus" AND received:"07/02/2022..08/02/2022"} -LogLevel Full -LogOnly



Beispiel 2 - Postfach durchsuchen, Bericht erstellen, Mails kopieren, original Mails im Benutzerpostfach nicht löschen
Hier wird das Postfach von MMustermann durchsucht nach Mails mit dem Betreff "Virus" und Eingang am 07./08.02.2022. Es wird ein Bericht erstellt und die Mails in das Postfach mailadmin@xyz.de in den Ordner SPAM kopiert. Der Bericht erfolgt an mailadmin@xyz.de im Ordner SPAM. Die originalen Mails Bleiben beim Benutzer ERHALTEN.
Search-Mailbox -Identity MMustermann -TargetMailbox mailadmin@xyz.de -TargetFolder "SPAM" -SearchQuery {Subject:"Virus" AND received:"07/02/2022..08/02/2022"} -LogLevel Full



Beispiel 3 - Postfach durchsuchen, Bericht erstellen, Mails kopieren, original Mails im Benutzerpostfachr LÖSCHEN
Hier wird das Postfach von MMustermann durchsucht nach Mails mit dem Betreff "Virus" und Eingang am 07./08.02.2022. Es wird ein Bericht erstellt und die Mails in das Postfach mailadmin@xyz.de in den Ordner SPAM verschoben. Der Bericht erfolgt ebenfalls an mailadmin@xyz.de im Ordner SPAM. Die verschobenen Mails werden in Unterordner pro Postfach abgelegt inkl. der Ordner Struktur, in der sie gefunden wurden.
Search-Mailbox -Identity MMustermann -TargetMailbox mailadmin@xyz.de -TargetFolder "SPAM" -SearchQuery {Subject:"Virus" AND received:07/02/2022..08/02/2022} -LogLevel Full -DeleteContent -Force




Beispiel 4 - Postfachdatenbank durchsuchen, Bericht erstellen, Mails kopieren, original Mails im Benutzerpostfach LÖSCHEN
Hier werden alle Postfächer der Postfachdatenbank MBXDB1 nach Mails mit dem Betreff "Virus" und Eingang am 07./08.02.2022 durchsucht. Es wird ein Bericht pro Postfach erstellt und die Mails in das Postfach mailadmin@xyz.de in den Ordner SPAM verschoben. Der Bericht erfolgt ebenfalls an mailadmin@xyz.de im Ordner SPAM. Die verschobenen Mails werden in Unterordner pro Postfach abgelegt inkl. der Ordner Struktur, in der sie gefunden wurden.
Get-Mailbox -Database "MBXDB1" -resultsize unlimited | Search-Mailbox -TargetMailbox mailadmin@xyz.de -TargetFolder "SPAM" -SearchQuery {Subject:"Virus" AND received:07/02/2022..08/02/2022} -LogLevel Full -DeleteContent -Force


Teamviewer: Server-ID vs. Session-ID - Teamviewer funktioniert nur wenn man angemeldet ist

Problem:
Ich hatte das Problem, dass ich auf einer VM den Teamviewer-Host einsetzen musste und wunderte mich dann, dass die Verbindung nur funktionierte, wenn man angemeldet ist!

Lösung:
Es gibt zwei IDs bei Teamviewer…eine Session-ID und eine Server-ID. Die Server-ID ist IMMER erreichbar.
Sollte keine Server-ID vorhanden sein, dann muss man unter Optionen -> Erweitert den Punkt "Erweiterte Mehrbenutzerunterstützung" aktivieren (Default ab Teamviewer 11 und höher).

Wenn man dann das Dialogfenster Hilfe -> "Über Teamviewer" öffnet sieht man beide IDs.

TeamViewer auf Windows Servern: Erweiterter Mehrbenutzermodus

Hier noch eine gute Quelle für das Härten einer Teamviewer-Installation:
How to Lock Down TeamViewer for More Secure Remote Access

Shops UTM Cluster: Slave-Node hängt bei Up2Date - Slave Node stuck in "UP2DATE" Mode

Problem:
Ich hatte das Problem, dass bei einem Sophos-Cluster des Upgrade des Slave-Nodes nicht durchlief. Der Node bliebt immer im Status "Up2Date" hängen und erst ein Neustart brachte ihn wieder in den normalen aber unaktuellen Zustand.
Nachdem ich eine Log-Files überprüft hatte, war klar, dass entweder das Update-File defekt oder nicht vollständig auf den Slave-Node übertragen wurde, aber das System der Meinung war, dass das alles in Ordnung ist.

Lösung:
Man muss nun das Update-File manuell auf den Slave-Node übertragen und das Upgrade dann manuell starten.
Hier die nötigen Schritte dafür:

Nötige Vorbereitungen:
- Update-Dateien bei Sophos ermitteln für späteren Download: Sophos UTM v9 Up2Date
- SSH- und ROOT-Zugang über die Webshell aktivieren und eventuell Kennwort neu setzen (loginuser/root)

Upgrade manuell durchführen:
1.) SSH-Verbindung zum aktuellen Master-Node herstellen und mittels loginuser anmelden
2.) ROOT-Rechte anfordern mittels:
su

3.) Ins Verzeichnis tmp wechseln:
cd /tmp

4.) Die zuvor ermittelte Update-Datei mittels wget herunterladen:
wget ftp://ftp.astaro.com/UTM/v9/up2date/u2d-sys-9.705007-706009.tgz.gpg

5.) Die heruntergeladene Update-Datei auf den Slave-Node übertragen (kann auch mit mehreren Updates durchgeführt werden):
scp u2d-sys-9.705007-706009.tgz.gpg loginuser@198.19.250.1:/tmp

6.) Nach erfolgreichem Kopiervorgang auf den Slave-Node wechseln:
 ha_utils ssh

7.) Hier ebenfalls Root-Rechte anfordern:
su -

8.) Ins Verzeichnis tmp wechseln:
cd /tmp

9.) _Die Update-Datei jetzt in den Update-Folder des Nodes verschieben und eventuell defekte Dateien vorher darin löschen:
mv u2d-sys-9.705007-706009.tgz.gpg /var/up2date/sys/u2d-sys-9.705007-706009.tgz.gpg

10.) Überprüfen, ob das Update in den Ordner sys kopiert wurde:
cd /var/up2date/sys

11.) Jetzt den Update-Vorgang auf dem Slave-Node manuell starten:
/sbin/auisys.plx --rpmargs --force

12.) WICHTIG: Nach erfolgreichem Update muss die Update-Datei auf Master und Slave gelöscht werden, sonst erfolgt eine Meldung eines angeblich neuen Updates.

mRemote: Einfache Anzeige von gespeichertem Kennwort

Problem:
Ich habe im mRemote-Tool ein Kennwort für eine Verbindung gespeichert und leider nicht dokumentiert (böser Ralf).
Wie komme ich jetzt an das Kennwort heran. Ein Export der mRemote-Daten war leider nicht erfolgreich.
Ich habe mir dazu folgenden "Trick" einfallen lassen - ich kann das Kennwort mittels Parameter an Anwendungen übergeben, warum also nicht an einen echo-Befehl in einer CMD?

Lösung:
Man erstellt sich unter "Tools" -> "Externe Tools" ein neues externes Tool
Hier vergibt man folgende Parameter:
Anzeigename : Show Password
Dateiname: cmd.exe
Argumente: /k echo %password%

Jetzt kann man auf die Verbindung einen Rechtsklick machen und unter "Externe Tools" -> "Show Password" klicken.
Es öffnet sich eine CMD und zeigt das Kennwort an.

Migration Sharepoint Fondation 2010 auf 2013 inkl. Content

Migration SharePoint Fondation 2010 -> 2013

--- SHAREPOINT 2010 READONLY MODE ---

Ich habe als ersten Schritt den alten Sharepoint 2010 in den ReadOnly-Modus versetzt, damit während der Datenmigration keiner mehr Änderungen durchführt, aber die Daten noch erreichbar sind.

- Öffnen der Zentraladministration
- Im Menü links "Anwendungsverwaltung" auswählen
- In der Übersicht rechts den Unterpunkt "Kontingente und Sperren konfigurieren" bei "Webseitensammlungen" auswählen
- Die gewünschte Webseitensammlung auswählen und den Punkt "Schreibgeschützt" setzen.
- Fertig, jetzt können keine Änderungen mehr vorgenommen werden und die Migration kann beginnen.

--- Prerequisite-Installer ---

Powershell-Installation der nötigen Serverkomponenten, da es sonst zu Fehlermeldungen kommt.
Import-Module ServerManager

Add-WindowsFeature NET-WCF-HTTP-Activation45,NET-WCF-TCP-Activation45,NET-WCF-Pipe-Activation45

Add-WindowsFeature Net-Framework-Features,Web-Server,Web-WebServer,Web-Common-Http,Web-Static-Content,Web-Default-Doc,Web-Dir-Browsing,Web-Http-Errors,Web-App-Dev,Web-Asp-Net,Web-Net-Ext,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Health,Web-Http-Logging,Web-Log-Libraries,Web-Request-Monitor,Web-Http-Tracing,Web-Security,Web-Basic-Auth,Web-Windows-Auth,Web-Filtering,Web-Digest-Auth,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Mgmt-Tools,Web-Mgmt-Console,Web-Mgmt-Compat,Web-Metabase,WAS,WAS-Process-Model,WAS-NET-Environment,WAS-Config-APIs,Web-Lgcy-Scripting,Windows-Identity-Foundation,Server-Media-Foundation,Xps-Viewer

Jetzt den Sharepoint Prerequisite-Installer starten und durchlaufen lassen:

• Microsoft .NET Framework 4.5: gleichwertige Produkte waren bereits installiert (es ist keine Aktion erfolgt).
• Windows Management Framework 3.0: gleichwertige Produkte waren bereits installiert (es ist keine Aktion erfolgt).
• Anwendungsserverrolle, Webserverrolle (IIS): erfolgreich konfiguriert.
• Systemeigener Client von Microsoft SQL Server 2008 R2 SP1: erfolgreich installiert.
• Microsoft Sync Framework Runtime v1.0 SP1 (x64): erfolgreich installiert.
• Windows Server AppFabric: erfolgreich installiert.
• Microsoft Identity-Erweiterungen: erfolgreich installiert.
• Microsoft Information Protection and Control-Client: erfolgreich installiert.
• Microsoft WCF Data Services 5.0: erfolgreich installiert.
• Microsoft WCF Data Services 5.6: erfolgreich installiert.
• Kumulatives Updatepaket 1 für Microsoft AppFabric 1.1 für Windows Server (KB2671763): erfolgreich installiert.

Reboot

--- SQL EXPRESS INSTALLATION ---

Instanzname : Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;
Version : 14.0.1000.169 (SQL Express 2017)

SQL SERVER MANAGEMENT STUDIO INSTALLATION
Pfad : C:\Program Files (x86)\Microsoft SQL Server Management Studio 18
.NET-Version : 4.7.2

--- SHAREPOINT INSTALLATION ---
Um die Installation erfolgreich durchführen zu können muss die Datei wsssetup.dll getauscht werden, da sonst die .NET-Version nicht erkannt wird, wenn diese höher als 4.5 ist. Dazu müssen wir die Installation entpacken und die Datei austauschen.
Quelle: Setup error if the .NET Framework 4.6 is installed
Zur Installation werden ein Farmadmin-Konto und ein Serviceadmin-Konto benötigt. Bitte brachten, dass diese zwei Konten nur die nötigen Rechte bekommen und kein Domänen-Admin sind.

- sharepoint.exe /extract:C:\SharePointInstaller
- Austausch der wsssetup.dll
- Install Sharepoint (Installationstyp: Vollständig)

--- Sharepoint-Wizard ---

Konfig-Database : \SQLEXPRESS
Konfig-DB-Name : SharePoint_Config
Farmadmin :
Passphrase : xxxxxxxxx
Admin-Center : http://Sservername>:18073/
Auth. Setting : NTLM
Dienst-Konto :

--- Datenmigration ---

- Backup alte Datenbank "WSS_Content" mittels SQL Studio
- Backup-Datei auf neuen Sharepoint kopieren
- Bestehende Sharepoint - 80 Webapplikation löschen (inkl. ISS und Content-Database – NICHT die Central Administration).
- Da die alte WSS-Content-Database mit „windows classic“ Auth daherkommt und die Applikationen aber mit „Claims“ Auth erstellt werden, gibt es Probleme bei der Migration. Somit muss die Sharepoint - 80 Webapplikation manuell über die Powershell erstellt werden:
New-SPWebApplication -Name "Sharepoint Site - 80" -ApplicationPool "SPAppPool" -AuthenticationMethod "Kerberos" -ApplicationPoolAccount (Get-SPManagedAccount "") -Port 80 -URL http://

- Sharepoint-Dienste heruntergefahren und die WSS-Content-Database aus der Sicherungsdatei wiederhergestellen
- Dienste wieder hochgefahren und mit dem nachfolgenden Test die Konfiguration überprüft:
Test-SPContentDatabase -Name WSS_Content –WebApplication http://

Vorsichtshalber noch mal Upgrade der Content-Database durchführen:
Get-SPContentDatabase | Upgrade-SPContentDatabase 

100.00% : SPContentDatabase Name=WSS_Content
Upgrade-SPContentDatabase : Das Upgrade wurde mit Fehlern abgeschlossen. Überprüfen Sie die Upgradeprotokolldatei
unter 'C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\LOGS\Upgrade-20190926-103708-855.log'.
Die Anzahl der Fehler und Warnungen ist am Ende der Updateprotokolldatei aufgeführt.
In Zeile:1 Zeichen:25
+ Get-SPContentDatabase | Upgrade-SPContentDatabase
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (Microsoft.Share...ContentDatabase:SPCmdletUpgradeContentDatabase) [Upgrade
-SPContentDatabase], SPUpgradeException
+ FullyQualifiedErrorId : Microsoft.SharePoint.PowerShell.SPCmdletUpgradeContentDatabase


Hiermit noch das Upgrade alle anderen Sharepoint-Datenbanken durchführen um den obrige Fehlermeldung zu lösen
PSConfig.exe -cmd upgrade -inplace b2b -wait -cmd applicationcontent -install -cmd installfeatures -cmd secureresources -cmd services -install

Die Konfiguration der SharePoint-Produkte wurde erfolgreich abgeschlossen.

Gesamtanzahl der ausgeführten Konfigurationseinstellungen: 8
Gesamtanzahl der erfolgreichen Konfigurationseinstellungen: 8
Gesamtanzahl der erfolglosen Konfigurationseinstellungen: 0
Die Konfiguration der SharePoint-Produkte wurde erfolgreich beendet.
Die Konfiguration der SharePoint-Produkte war erfolgreich.

Eigentlich fertig! Bei mir war noch das Problem, dass sich kein Benutzer am Intranet anmelden konnte – ich bekam immer ein Fenster zur Eingabe der Anmeldedaten angezeigt. Das hat mir viele graue Haare gekostet, aber am Ende war die Lösung mal wieder logisch und in den Basics versteckt – IIS Authentifizierung!
Hier war Kerberos als Standard gesetzt und ich habe NTLM eingetragen und schon hat alles funktioniert!

- IIS-Manager öffnen
- Sharepoint-Website suchen und Authentifizierung öffnen
- Hier bei „Windows Authentifizierung“ die „Provider“ auswählen
- Hier nur NTLM setzen
- iisreset durchführen – läuft!

Quellen für Hilfestellungen:
Install SharePoint Foundation 2013 on Windows Server 2016 Solution
SharePoint: Common NTLM Authentication Issues, aka: Consider Ditching NTLM
Live Migration of SharePoint 2010 to SharePoint 2013
SQL Server: Einzelbenutzermodus ausschalten
Change SharePoint Site To Read Only

Exchange 2016 DAG: Prüfung und Schwenk der DAG-Datenbanken auf den Master (ReBalance DAG)

Das nachfolgende Skript prüft, ob auf dem aktuellen Exchange DAG Server Datenbank laufen, für die er nicht der "Prefered ActiveServer" ist bzw. ob ihm selbst Datenbanken "fehlen", für die er selbst der "Prefered ActiveServer" ist.
Für jede gefundene Datenbank erfolgt eine gesonderte Abfrage, ob diese zurückgeschwenkt werden soll.
Für korrekte Datenbanken erfolgt nur eine Ausgabe. Zur optischen Prüfung werden die Ausgaben farblich mit rot und grün dargestellt:

# Das Skript überprüft den lokalen Server, ob Datenbanken auf dem System gemountet sind,
# welche primär auf einem anderen Server laufen sollten
# Werde solche Datenbanken gefunden, dann werden diese zurückverschoben und das DAG wieder
# in den ausbalancierten Zustand gebracht
#
# Ralf Entner

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
Get-MailboxDatabase -server $env:COMPUTERNAME | Sort Name | ForEach{
    $db = $_.Name
    $ActivServer = $_.Server.Name
    $OriginServer = $_.ActivationPreference | ? {$_.Value -eq 1}


    If ($ActivServer -ne $OriginServer.Key)
    {
        Write-Host "$db auf $ActivServer soll bevorzugt auf $($OriginServer.Key) laufen – FALSCH" -ForegroundColor Red
        Move-ActiveMailboxDatabase $db -ActivateOnServer $($OriginServer.Key) -Confirm:$Y
    }
    Else
    {
       Write-Host "$db auf $ActivServer soll bevorzugt auf $($OriginServer.Key) laufen - OK" -ForegroundColor Green
    }
}
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)