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


Überprüfen von EoL (End of Life) Software

Ich werde öfter in meinem Job gefragt wie ich so schnell das Datum einer Software ermittele die EoL ist. Naja in vielen Fällen ist es ein curl auf die API von https://endoflife.date/. Möchte ich mir z.B. alle .NET Versionen anzeigen lassen (;) greetz an JH) dann geht das mit diesem curl Aufruf
curl --request GET -s --url https://endoflife.date/api/dotnet.json --header 'Accept: application/json' | jq
der Output liefert mit dann alle .NET Versionen mit den benötigten Versionen.


Das Projekt ist natürlich nur so gut wie die Contributors , Bock mit zu machen ? hier gehts zum Github https://github.com/endoflife-date/endoflife.date/

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

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

Powershell : New-SmbShare "no mapping between account and sid"

Ich musste heute in einem größeren Skript mehrere Folder anlegen und diese auf AD Gruppen berechtigen.
Die NTFS Rechte waren kein Problem jedoch die Rechte auf die Freigabe haben leider nicht geklappt.
Ich hab immer nur diese Fehlermeldung erhalten.

no mapping between account names and security IDs was done

Wenn ich jedoch den Befehl direkt in der Powershell eingegeben hat alles geklappt.
New-SmbShare -Path D:\DEMO_PFAD -Name Demo -ChangeAccess Group1,Group2,Group3,Group4 -FullAccess AdminGroup
also kann ja hier nur ein Problem mit der Bulk Verarbeitung vorliegen. Nach etwas basteln bin ich dann auf diese Lösung gekommen.
# create Share
$smbpath = 'D:\DEMO_PFAD'
$smbname = 'DEMO'
New-SmbShare -Path $smbpath -Name $smbname -FullAccess AdminGroup
$Groups = @()
$Groups += 'Group1'
$Groups += 'Group2'
$Groups += 'Group3'
$Groups += 'Group4'
# grant change permission on share
foreach ($Group in $Groups)
{
    Grant-SmbShareAccess -Name $smbname -AccountName $Group -AccessRight Change -Force
}


Quelle :
https://docs.microsoft.com/en-us/powershell/module/smbshare/new-smbshare?view=windowsserver2019-ps
https://docs.microsoft.com/en-us/powershell/module/smbshare/grant-smbshareaccess?view=windowsserver2019-ps
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)