Benutzer mit den meisten Antworten
Ablaufdatum von Zertifikaten in korrekten Datentyp umwandeln und mit get-date verrechen.

Frage
-
Hi,
ich will unabhängig vom Betriebssystem und der Middleware an einer zentralen Stelle das Ablaufdatum von Zertifikaten überwachen. Dazu habe ich folgendes Script geschrieben:
#zu prüfende URL $uri = 'https://www.website.de' #Aufbau der abfrage der Website $request = [System.Net.HttpWebRequest]::Create($uri) try { #startet die Anfrage und verwirft die Antwort, da Fehler nicht relevant sind. $request.GetResponse().Dispose() } catch [System.Net.WebException] { if ($_.Exception.Status -eq [System.Net.WebExceptionStatus]::TrustFailure) { #Auch vertrauensbrüche des Zertifikats werden ignoriert. } else { throw } } #Ablaufdatum des Zertifikats $certexpiration = $request.ServicePoint.Certificate.GetExpirationDateString() | get-date -Format d $date = (get-date -format d) $daysremaining = $certexpiration - $date
Nun scheitere ich daran, das ausgegebene Ablaufdatum mit get-date zu verrechenen.
Ich habe schon versucht, den Datentyp mit [DateTime] zu ändern oder ein Int32 daraus zu machen, das lässt PS aber nicht zu.Kann mir jmd. erklären, was der Fehler ist?
Gruß
- Bearbeitet marc-sysadmn Freitag, 28. Februar 2020 09:44
Antworten
-
Moin,
Get-Date -Format liefert einen String. Falls er nach Datum aussieht, kannst Du ihn mit [datetime]::ParseExact() oder mit Get-Date in ein Datetime umsetzen.
EDIT: Folgendes funktioniert hier:
Get-Date $request.ServicePoint.Certificate.GetExpirationDateString()
Evgenij Smirnov
- Bearbeitet Evgenij Smirnov Freitag, 28. Februar 2020 10:57
- Als Antwort markiert marc-sysadmn Freitag, 28. Februar 2020 11:34
-
Hatte ich probiert, dabei bekomme ich folgende Fehlermeldung:
Ausnahme beim Aufrufen von "ParseExact" mit 3 Argument(en): "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt."
... 'sollte so gehen:
$DateTimeString = "16.02.2022" [DateTime]::ParseExact($DateTimeString,'dd.MM.yyyy',$null)
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
- Als Antwort markiert marc-sysadmn Freitag, 28. Februar 2020 13:34
Alle Antworten
-
Es wäre hilfreich gewesen, mal ein Beispiel-Datum zu sehen. Mit der dotNet-Methode DateTime.ParseExact bekommt man fast alles in ein korrektes Datum umgewandelt.
https://docs.microsoft.com/de-de/dotnet/api/system.datetime.parseexact?view=netframework-4.8
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
-
Moin,
Get-Date -Format liefert einen String. Falls er nach Datum aussieht, kannst Du ihn mit [datetime]::ParseExact() oder mit Get-Date in ein Datetime umsetzen.
EDIT: Folgendes funktioniert hier:
Get-Date $request.ServicePoint.Certificate.GetExpirationDateString()
Evgenij Smirnov
- Bearbeitet Evgenij Smirnov Freitag, 28. Februar 2020 10:57
- Als Antwort markiert marc-sysadmn Freitag, 28. Februar 2020 11:34
-
Es wäre hilfreich gewesen, mal ein Beispiel-Datum zu sehen. Mit der dotNet-Methode DateTime.ParseExact bekommt man fast alles in ein korrektes Datum umgewandelt.
Hatte ich probiert, dabei bekomme ich folgende Fehlermeldung:
Ausnahme beim Aufrufen von "ParseExact" mit 3 Argument(en): "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt."
Get-Date $request.ServicePoint.Certificate.GetExpirationDateString()
Damit klappts bei mir, vielen Dank. Ich hatte die ganze Zeit noch das Datum umformatiert mit :
$certexpiration = $request.ServicePoint.Certificate.GetExpirationDateString() | get-date -Format d und $date = (get-date -format d)
Und wenn ich die dann miteinander verrechnen wollte kam:
Der Wert "16.02.2022" kann nicht in den Typ "System.Int32" konvertiert werden. Fehler: "Die Eingabezeichenfolge hat das falsche Format."
Daraufhin hatte ich noch
[DateTime]$certexpiration = $request.ServicePoint.Certificate.GetExpirationDateString() | get-date -Format d und [DateTime]$date = (get-date -format d)
versucht, dabei kam :
Der Wert "16.02.2022" kann nicht in den Typ "System.DateTime" konvertiert werden. Fehler: "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt."
Vielen Dank Evgenij
-
Hatte ich probiert, dabei bekomme ich folgende Fehlermeldung:
Ausnahme beim Aufrufen von "ParseExact" mit 3 Argument(en): "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt."
... 'sollte so gehen:
$DateTimeString = "16.02.2022" [DateTime]::ParseExact($DateTimeString,'dd.MM.yyyy',$null)
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
- Als Antwort markiert marc-sysadmn Freitag, 28. Februar 2020 13:34
-
... 'sollte so gehen:
$DateTimeString = "16.02.2022" [DateTime]::ParseExact($DateTimeString,'dd.MM.yyyy',$null)
Sollte es, tut es aber in Verbindung mit ServicePoint.Certificate.GetExpirationDateString() nicht.
ServicePoint.Certificate.GetExpirationDateString() gibt folgenden String zurück:
26.09.2021 11:16:00
$request = Get-Date $request.ServicePoint.Certificate.GetExpirationDateString() [DateTime]::ParseExact($request,'dd.MM.yyyy',$null)
Ergibt:
Ausnahme beim Aufrufen von "ParseExact" mit 3 Argument(en): "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt." In Zeile:1 Zeichen:1 + [DateTime]::ParseExact($request,'dd.MM.yyyy',$null) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : FormatException
Evgenijs Lösung funktioniert. Man darf nur dabei das Datum nicht umformatierten (das war mein Fehler).
Gruß
Update:
$request = $request.ServicePoint.Certificate.GetExpirationDateString() | Get-Date -Format d $request = [DateTime]::ParseExact($request,'dd.MM.yyyy',$null)
Funktioniert ebenfalls. Hab leider meine versuche schon gelöscht, so in etwa hatte ich es eigentlich auch versucht, aber scheinbar hatte ich doch was anders :-D
Gruß
- Bearbeitet marc-sysadmn Freitag, 28. Februar 2020 13:34
-
ServicePoint.Certificate.GetExpirationDateString() gibt folgenden String zurück:
Das Datum sieht ja auch wieder anders aus, als Du's vorher gepostest hattest. Dann musst Du den Format-String natürlich noch anpassen ... also so ...26.09.2021 11:16:00
$DateTimeString = '26.09.2021 11:16:00' [DateTime]::ParseExact($DateTimeString, 'dd.MM.yyyy HH:mm:ss', $null)
Das meinste ich vorher, dass ein Beispiel-Datum hilfreich gewesen wäre. ;-)
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''