Printserver Migration Part #1: Export TCP- und LPR-Ports

Ich stelle hier ein paar Skripte zur Verfügung, welche einem die Migration eines Printservers etwas vereinfachten. Selbstverständlich kann man das auch mir Printmig oder anderen Tools durchführen. Ich wollte meinen neuen Printserver from scratch neu installieren, daher der etwas andere Weg. Die Migration wird in vier Teile erfolgen:

Part #1: Export TCP- und LPR-Ports
Part #2: Export Drucker mit allen Settings in eine XML-Datei
Part #3: Import TCP- und LPR-Ports
Part #4: Import aller Drucker mit allen Settings

Part #1: Export TCP- und LPR-Ports
Für den späteren Import der zwei Port-Typen werden unterschiedliche Informationen benötigt, daher habe ich hierfür zwei Skripte erstellt, welche die Konfigurationen exportieren:

Export-PrinterPorts_TCP_to_CSV.ps1
<# 
.NAME
    Export-PrinterPorts_TCP_to_CSV.ps1

.AUTHOR
    Ralf Entner

.SYNOPSIS
    Script exports all TCP Printer Ports to a csv file.

.DESCRIPTION 
    Script exports all TCP Printer Ports with all settings to a csv file. In the csv file there are address, port number and smtp settings.
 
.NOTES 
    The script exports only TCP Ports, not LPR Ports (see other script).

.COMPONENT 
    No powershell modules needed

.LINK 
    No Links
 
.Parameter ParameterName 
    $CSVPath - Define export path of the csv file
#>

# Export CSV path
$CSVPath = "C:\Printmig\PortsTCP.csv"

# Get Printerports with all nessesary informations
$Printerports = Get-PrinterPort | ?{$_.Description -like "*TCP*"} | select Name, PrinterHostAddress, PortNumber, SNMPCommunity, SNMPEnabled 

#Export informations to CSV
$Printerports | Export-Csv -Path $CSVPath -Delimiter ";" -Encoding UTF8 -NoTypeInformation


Export-PrinterPorts_LPR_to_CSV.ps1
<# 
.NAME
    Export-PrinterPorts_LPR_to_CSV.ps1

.AUTHOR
    Ralf Entner

.SYNOPSIS
    Script exports all LPR Printer Ports to a csv file.

.DESCRIPTION 
    Script exports all LPR Printer Ports with all settings to a csv file. In the csv file there are name, protocol, port nubmer and printer host address.
 
.NOTES 
    The script exports only LPR Ports, not TCP Ports (see other script).

.COMPONENT 
    No powershell modules needed

.LINK 
    No Links
 
.Parameter ParameterName 
    $CSVPath - Define export path of the csv file
#>
# Export CSV path
$CSVPath = "C:\Printmig\PortsLPR.csv"

# Get Printerports with all nessesary informations
$Printerports = Get-PrinterPort | ?{$_.PortMonitor -eq "LPR Port"} | Select-Object Name, Protocol, PortNumber, PrinterHostAddress

#Export informations to CSV
$Printerports | Export-Csv -Path $CSVPath -Delimiter ";" -Encoding UTF8 -NoTypeInformation


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


POWERSHELL : scan nach log4j

aus gegebenen anlass hier ein kleines Powershell wie man nach jar files schauen kann. Das Array mit den Pfaden kann beliebig erweitert werden.

$SearchPath = @(${env:ProgramFiles} , ${env:ProgramFiles(x86)} , ${env:JAVA_HOME} , 'D:\Program Files' , 'D:\Program Files (86)' , 'D:\Tools')
$FilesFound = @()
$FileSearch = 'log4*.jar'
foreach ($Path in $SearchPath)
{
    $FilesFound += (Get-ChildItem -Path ${Path} -Filter ${FileSearch} -Recurse -ErrorAction SilentlyContinue)
}
if ($FilesFound) 
{
Write-Output ('{0} found on system , please check files' -f ${FileSearch})
Write-Output '------------------------------'
$FilesFound
}
else
{
Write-Output ('{0} not found on system' -f ${FileSearch})
}


Hier gibts das alles nochmal in Professionell ;-)
https://hochwald.net/post/powershell-based-log4j-vulnerabilities-scanner/


https://logging.apache.org/log4j/1.2/
https://www.lunasec.io/docs/blog/log4j-zero-day/
https://www.randori.com/blog/cve-2021-44228/
https://www.bsi.bund.de/DE/Service-Navi/Presse/Pressemitteilungen/Presse2021/211211_log4Shell_WarnstufeRot.html

Hier gibts noch einen Scanner für das Problem :
https://github.com/hillu/local-log4j-vuln-scanner

MSSQL : Backup erstellen mit Powershell

Ich hatte die Anforderung das Backups eines MSSQL Servers erstellt werden müssen. Das vorhandene Powershell Script war "suboptimal". Aus diesem Grund habe ich mir mal 2 Stunden Zeit genommen und habe selbst eins erstellt.

Getestet hab ich es mit MSSQL 2017 / 2019 sollte aber grundsätzlich auf jedem MSSQL Server laufen auf dem SQLPS zur Verfügung steht.

Hier gehts zum Skript : https://github.com/Mokkujin/powershell/tree/main/server/mssql

Exchange Powershell: Prüfen der Exchange Schema Version

Problem:
Bei der Installation eines kumulativen Updates der Exchange Server ist meistens nicht ganz klar, ob ein Schema Update nötig ist oder nicht. Microsoft gibt meistens die nötige Schema Version an.

Lösung:
Um zu prüfen, ob ich die richtige Version bereits verwende, habe ich mir ein PowerShell-Skript geschrieben, das die Exchange Schema Version ausgibt:

# Exchange Schema Version

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn

$sc = (Get-ADRootDSE).SchemaNamingContext
$ob = "CN=ms-Exch-Schema-Version-Pt," + $sc
$ru = "RangeUpper: $((Get-ADObject $ob -pr rangeUpper).rangeUpper)"

$dc = (Get-ADRootDSE).DefaultNamingContext
$ob = "CN=Microsoft Exchange System Objects," + $dc
$ovd = "ObjectVersion (Default): $((Get-ADObject $ob -pr objectVersion).objectVersion)"

$cc = (Get-ADRootDSE).ConfigurationNamingContext
$fl = "(objectClass=msExchOrganizationContainer)"
$ovc = "ObjectVersion (Configuration): $((Get-ADObject -LDAPFilter $fl -SearchBase $cc -pr objectVersion).objectVersion)"

Write-Output $ru $ovd $ovc


Eine schöne Übersicht der jeweiligen Schema Version findet ihr bei Ali:
Ali Tajran: Exchange schema versions (up to date list)

Windows : pslogrotate.ps1 um Logfiles zu rotieren

Wir haben hier einige Anwendungen unter Windows im Einsatz die unsere Platten zuschreiben mit Logfiles. Aus meinen Linux Systemen kenne ich logrotate und pslogrotate ist eine light Version von diesem.

pslogrotate baut auf powershell 5 auf und ist mit einem json einfach zu configurieren. Definieren kann mal die Vorhaltezeit der Logs in Tagen und ob die Logs komprimiert werden sollen. Auch der Dienst kann auf restart gesetzt werden. Das bedeutet mein Script beendet den Dienst roliert das Logfile und startet den Dienst wieder.

Gerne bin ich für Feature Requests offen , diese dann bitte in Github direkt stellen.

Hier gehts zu pslogrotate.ps1 : https://github.com/Mokkujin/powershell/tree/main/pslogrotate
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)