none
Ablaufdatum von Zertifikaten in korrekten Datentyp umwandeln und mit get-date verrechen. RRS feed

  • 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ß



    Freitag, 28. Februar 2020 08:59

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

    http://evgenij.smirnov.de


    Freitag, 28. Februar 2020 10:54
  • 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
    Freitag, 28. Februar 2020 12:16

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''

    Freitag, 28. Februar 2020 10:31
  • 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

    http://evgenij.smirnov.de


    Freitag, 28. Februar 2020 10:54
  • 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

    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
    Freitag, 28. Februar 2020 12:16
  • ... '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ß

    Freitag, 28. Februar 2020 13:27
  • ServicePoint.Certificate.GetExpirationDateString() gibt folgenden String zurück:

    26.09.2021 11:16:00

    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 ...
    $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''

    Freitag, 28. Februar 2020 13:46