Letzten Freitag hat sich ein IT-Sicherheitsunternehmen (Crowdstrike Holdings, Inc.
) nicht
gerade mit Ruhm bekleckert. Das Ergebnis: zahlreiche Systemadministratoren mussten viele
Überstunden leisten und das Wochenende war für viele Menschen außerhalb der IT-Branche
ruiniert.
Dank der Disziplin und Expertise weltweit beschäftigter Systemadministratoren konnten die
meisten Systeme schlussendlich wieder in Betrieb genommen werden. Auch wenn mein
Arbeitgeber nicht direkt betroffen war und mein Team sich folglich stressfrei ins Wochenende
verabschiedete, möchte ich pünktlich zum System Administrator Appreciation Day ![](img/link.svg)
allen interessierten Informatikern mit diesem Beitrag meine Wertschätzung ausdrücken und
einige praktische Lösungsschablonen aus meiner beruflichen Praxis vorstellen.
Lösungsschablonen:
↓ Entscheidungsfindung für Dateidownload über ein Datumsvergleich
Entscheidungsfindung für Dateidownload über ein Datumsvergleich
In der beruflichen Praxis eines Systemadministrators kommt es häufig vor, dass bestimmte
Dateien nur dann heruntergeladen oder aktualisiert werden müssen, wenn sie neuer sind als
die bereits vorhandenen. Eine einfache, aber effektive Methode zur Entscheidungsfindung für Dateidownloads basiert auf einem Datumsvergleich.
Hinzu kommt, dass der vom Betriebssystem aufgedrückte Zeitstempel nach dem Download mit
dem Zeitstempel der Downloadquelle synchronisiert werden muss, um einen effizienten
Datumsvergleich (ab dem zweiten Durchlauf) durchzuführen.
<#
RSA-Update-Downloader Ver. 0.2
(C) Alexander H. / STEALTHCHIP.DE
#>
Start-Transcript -Path "C:\Skripte\RSAUPDATE\RSAKEYDATE-Transcript.log"
$url = "https://trustcenter-data.itsg.de/dale/gesamt-rsa4096.key"
$verzeichnis = "C:\Skripte\RSAUPDATE\RSAFILE"
$logdateipfad = "C:\Skripte\RSAUPDATE\RSAKEYDATE.log"
$dateipfad = Join-Path $verzeichnis (Split-Path $url -Leaf)
if (Test-Path $dateipfad) {
$lastModifiedRemote = (Invoke-WebRequest -Uri $url -Method Head -UseBasicParsing).Headers["Last-Modified"]
$lastModifiedRemoteDateTime = [DateTime]::ParseExact($lastModifiedRemote, "ddd, dd MMM yyyy HH:mm:ss 'GMT'", [System.Globalization.CultureInfo]::InvariantCulture)
$creationTimeLocal = (Get-Item $dateipfad).CreationTime
if ($creationTimeLocal -lt $lastModifiedRemoteDateTime) {
Invoke-WebRequest -Uri $url -OutFile $dateipfad
(Get-Item $dateipfad).CreationTime = $lastModifiedRemoteDateTime
$logText = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | Datei heruntergeladen und Erstelldatum aktualisiert."
Add-Content -Path $logdateipfad -Value $logText
} else {
$logText = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | Die Datei ist bereits vorhanden und aktuell."
Add-Content -Path $logdateipfad -Value $logText
}
} else {
Invoke-WebRequest -Uri $url -OutFile $dateipfad
$lastModified = (Invoke-WebRequest -Uri $url -Method Head -UseBasicParsing).Headers["Last-Modified"]
$lastModifiedDateTime = [DateTime]::ParseExact($lastModified, "ddd, dd MMM yyyy HH:mm:ss 'GMT'", [System.Globalization.CultureInfo]::InvariantCulture)
(Get-Item $dateipfad).CreationTime = $lastModifiedDateTime
$logText = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | Datei heruntergeladen und Erstelldatum aktualisiert."
Add-Content -Path $logdateipfad -Value $logText
}
Stop-Transcript
Der unter $verzeichnis angegebene Ordner muss vor Skriptausführung erstellt werden.