Powershell: Export in .ics Datei
Hallo zusammen,
im Internet habe ich ein Skript gefunden, welches die Ablaufdaten der Zertifikate unserer Webserver auslesen kann und in eine .csv Datei einträgt und diese dann per Mail verschickt.
Das funktioniert soweit auch super. Deutlich lieber wäre mir aber ein Export in eine .ics Datei, damit die Ablaufdaten direkt in einem Kalender eingetragen sind.
Hat irgendwer dazu eine Idee?
Macht es vielleicht mehr Sinn die .csv Datei mit einem zusätzlichen Skript zu konvertieren?
Ziel ist es, dass der Vorgang alle paar Monate über die Aufgabenplanung eines Servers gestartet wird, und dann einen aktualisierten Kalender per Mail verschickt.
Hier ist das Skript zum auslesen der Zertifikate:
#copy all the urls and servers that has certificate installed in your environment into text file rename it as urls.txt
#After you run the script, in same file, script will append data by adding date, time, url and server cert info.
param
(
[parameter(mandatory=$true)][String]$path
)
$AllProtocols = [System.Net.SecurityProtocolType]'Tls11,Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols
$urls = Get-Content $path
#d.ecs http gateway URL's
$date = get-date -Format G
$finaloutput = @()
$attached_file = "$psscriptroot\CertDetails.csv"
[Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
foreach ($url in $urls) {
try {
$req = [Net.HttpWebRequest]::Create($url)
$req.GetResponse() | Out-Null
$req.ServicePoint.Certificate.GetIssuerName().split(",", [System.StringSplitOptions]::RemoveEmptyEntries) | Where-Object { $_ -match "O=" } | Out-Null
if ($LASTEXITCODE) {
$certissuer = ($req.ServicePoint.Certificate.GetIssuerName().split(",", [System.StringSplitOptions]::RemoveEmptyEntries) | Where-Object { $_ -match "O=" }).trim("O =")
}
else {
$certissuer = ($req.ServicePoint.Certificate.GetIssuerName().split(",", [System.StringSplitOptions]::RemoveEmptyEntries) | Where-Object { $_ -match "CN=" } ).trim("CN =")
}
$output = [PSCustomObject]@{
URL = $url
'Startdatum' = $req.ServicePoint.Certificate.GetEffectiveDateString()
'Ablaufdatum' = $req.ServicePoint.Certificate.GetExpirationDateString()
'Zertifikatsinhaber' = $certissuer
"Datum heute" = $date
}
Write-Host Check $url -f Green
$finaloutput += $output
}
catch {
Write-Host Es ist ein Fehler aufgetreten $url`: $_ -f Red
try {
$formatteddata = [PSCustomObject]@{
URL = "Fehler bei $url"
'Startdatum' = $req.ServicePoint.Certificate.GetEffectiveDateString()
'Ablaufdatum' = $req.ServicePoint.Certificate.GetExpirationDateString()
'Zertifikatsinhaber' = $certissuer
"Datum heute" = $date
}
}
catch {
$formatteddata = [PSCustomObject]@{
URL = "Timeout bei $url"
'Startdatum' = $date
'Ablaufdatum' = $date
'Zertifikatsinhaber' = "Unbekannt - konnte nicht ermittelt werden"
"Datum heute" = $date
}
}
$finaloutput += $formatteddata
}
}
Remove-item $psscriptroot\CertDetails.csv
$finaloutput | export-csv -Path $psscriptroot\CertDetails.csv -Append -NoTypeInformation –Delimiter ";"
$message= "Das Ablaufdatum der Zertifikate entnehmen Sie bitte dem Anhang."
$messagetitle= "Ablauf der d.3 Zertifikate"
Send-MailMessage -From Zertifikate@mail.mail -To "mail@mail.mail" -Subject $messagetitle -body $message -Attachments $attached_file -SmtpServer exchange.mail.intern -Encoding UTF8
Danke für eure Hilfe!
Gruß Jannik
im Internet habe ich ein Skript gefunden, welches die Ablaufdaten der Zertifikate unserer Webserver auslesen kann und in eine .csv Datei einträgt und diese dann per Mail verschickt.
Das funktioniert soweit auch super. Deutlich lieber wäre mir aber ein Export in eine .ics Datei, damit die Ablaufdaten direkt in einem Kalender eingetragen sind.
Hat irgendwer dazu eine Idee?
Macht es vielleicht mehr Sinn die .csv Datei mit einem zusätzlichen Skript zu konvertieren?
Ziel ist es, dass der Vorgang alle paar Monate über die Aufgabenplanung eines Servers gestartet wird, und dann einen aktualisierten Kalender per Mail verschickt.
Hier ist das Skript zum auslesen der Zertifikate:
#copy all the urls and servers that has certificate installed in your environment into text file rename it as urls.txt
#After you run the script, in same file, script will append data by adding date, time, url and server cert info.
param
(
[parameter(mandatory=$true)][String]$path
)
$AllProtocols = [System.Net.SecurityProtocolType]'Tls11,Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols
$urls = Get-Content $path
#d.ecs http gateway URL's
$date = get-date -Format G
$finaloutput = @()
$attached_file = "$psscriptroot\CertDetails.csv"
[Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
foreach ($url in $urls) {
try {
$req = [Net.HttpWebRequest]::Create($url)
$req.GetResponse() | Out-Null
$req.ServicePoint.Certificate.GetIssuerName().split(",", [System.StringSplitOptions]::RemoveEmptyEntries) | Where-Object { $_ -match "O=" } | Out-Null
if ($LASTEXITCODE) {
$certissuer = ($req.ServicePoint.Certificate.GetIssuerName().split(",", [System.StringSplitOptions]::RemoveEmptyEntries) | Where-Object { $_ -match "O=" }).trim("O =")
}
else {
$certissuer = ($req.ServicePoint.Certificate.GetIssuerName().split(",", [System.StringSplitOptions]::RemoveEmptyEntries) | Where-Object { $_ -match "CN=" } ).trim("CN =")
}
$output = [PSCustomObject]@{
URL = $url
'Startdatum' = $req.ServicePoint.Certificate.GetEffectiveDateString()
'Ablaufdatum' = $req.ServicePoint.Certificate.GetExpirationDateString()
'Zertifikatsinhaber' = $certissuer
"Datum heute" = $date
}
Write-Host Check $url -f Green
$finaloutput += $output
}
catch {
Write-Host Es ist ein Fehler aufgetreten $url`: $_ -f Red
try {
$formatteddata = [PSCustomObject]@{
URL = "Fehler bei $url"
'Startdatum' = $req.ServicePoint.Certificate.GetEffectiveDateString()
'Ablaufdatum' = $req.ServicePoint.Certificate.GetExpirationDateString()
'Zertifikatsinhaber' = $certissuer
"Datum heute" = $date
}
}
catch {
$formatteddata = [PSCustomObject]@{
URL = "Timeout bei $url"
'Startdatum' = $date
'Ablaufdatum' = $date
'Zertifikatsinhaber' = "Unbekannt - konnte nicht ermittelt werden"
"Datum heute" = $date
}
}
$finaloutput += $formatteddata
}
}
Remove-item $psscriptroot\CertDetails.csv
$finaloutput | export-csv -Path $psscriptroot\CertDetails.csv -Append -NoTypeInformation –Delimiter ";"
$message= "Das Ablaufdatum der Zertifikate entnehmen Sie bitte dem Anhang."
$messagetitle= "Ablauf der d.3 Zertifikate"
Send-MailMessage -From Zertifikate@mail.mail -To "mail@mail.mail" -Subject $messagetitle -body $message -Attachments $attached_file -SmtpServer exchange.mail.intern -Encoding UTF8
Danke für eure Hilfe!
Gruß Jannik
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1375926722
Url: https://administrator.de/contentid/1375926722
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
2 Kommentare
Neuester Kommentar
Das iCalendar Format ist Standardisiert, du brauchst also nur die RFC durchlesen und kannst danach ICS Dateien mit deinen Daten erstellen
https://datatracker.ietf.org/doc/html/rfc5545
Wobei ich das ja persönlich wenn bspw. ein Exchange zum Einsatz kommen würde, direkt in eine Mailbox via EWS schreiben würde statt erst eine ICS Datei zu erstellen die man dann noch importieren muss.
Aber selbst das wäre überflüssig wenn man die Zertifikatserneuerung automatisiert, in den meisten Fällen ja schon durch Lets Encrypt vorgegeben, weil die alle 3 Monate ablaufen. Ich benachrichtige eigentlich nur wenn bei dem Erneuerungs-Prozess was schief läuft bzw. wenn es nur noch 10 Tage bis zum Ablauf eines Certs sind und man manuell eingreifen muss, ansonsten geht das hier silent von statten.
https://datatracker.ietf.org/doc/html/rfc5545
Wobei ich das ja persönlich wenn bspw. ein Exchange zum Einsatz kommen würde, direkt in eine Mailbox via EWS schreiben würde statt erst eine ICS Datei zu erstellen die man dann noch importieren muss.
Aber selbst das wäre überflüssig wenn man die Zertifikatserneuerung automatisiert, in den meisten Fällen ja schon durch Lets Encrypt vorgegeben, weil die alle 3 Monate ablaufen. Ich benachrichtige eigentlich nur wenn bei dem Erneuerungs-Prozess was schief läuft bzw. wenn es nur noch 10 Tage bis zum Ablauf eines Certs sind und man manuell eingreifen muss, ansonsten geht das hier silent von statten.