Powershell Zertifikate prüfen?

2 Antworten

Die Nummer mit den Zertifikaten kann ich mir Dank ZaoDaDong sparen.

bliebe der eigentlich einfachere Teil, die Arbeit mit CSVs...

Gewöhn kommen gut exportierte CSV nicht ohne Header, aber es gibt sie...

"test - Headerles.csv"

"2021-05-22","5","bla und Blub","https://www.gutefrage.net/frage/powershell-zertifikate-pruefen","666"
"13.06.2021","47","Blalali Ritschratsch","https://www.google.com/search?q=example","0.314"

getHeaderlessCSV.ps1

 #CSV-Datei (ohne Header) in ein costom-Objekte laden...
 #Header selbst definieren
$Header="Datum","Irgendwas","WasAnderes","Link","sonstwas"
$myObjekts = Import-Csv 'test - Headerles.csv' -Header $Header
#einzeln anzeigen  
$myObjekts|%{
 Write-Host 'Das aktuell Opjekt:' -f green
  $_
} 
pause

Die "normale" CSV-Datei kommt s daher:

test.csv

"Datum","Irgendwas","WasAnderes","Link","sonstwas"
"2021\05\22","5","bla und Blub","https://www.gutefrage.net/frage/powershell-zertifikate-pruefen","666"
"13.06.2021","47","Blalali Ritschratsch","https://www.google.com/search?q=example","0.314"

das Vorgehen ist fast gleich, nur das wir keinen expliziten Header definieren müssen.

getCSV.ps1

Import-Csv 'test.csv'|%{
 Write-Host 'Das aktuell Opjekt:' -f green
  $_
} 

...allerdings haben die Felder des importierten Objekts alle den Typ String. Das ist erstmal nicht weiter schlimm, da Powershell bei einfachen Typen die Conversion der Datentypen am späteren Einsatzort von selbst vornimmt.

aber schöner kann es sein, wenn wir gleich voll typisierte Objekte "bauen". dabei können wir wirklich kreativ sein.

Import-Csv 'test.csv'|%{
  [PSCustomObject]@{
    Date     = (Get-Date $_.Datum)
    ShoeSize = [int]$_.Irgendwas
    Name     = $_.WasAnderes
    Uri      = [uri]$_.Link 
    XValue   = [double]$_.sonstwas
  }
}
pause

...aber wieder zu ZaoDaDong's Link (Butter bei die Fische):

$myCertificateStamps = Import-Csv 'test.csv'|%{
 $req = [Net.HttpWebRequest]::Create($_.link)
 $req.GetResponse() >$Null
 [PSCustomObject]@{
  URL = $_.Link
   # vergiss solchen Kack wie 'Name mit Leerzeichen' = "Laberrhababer" !!! In Properties immer saubere Feldbezeichner verwenden!!!
  CertStartDate = $req.ServicePoint.Certificate.GetEffectiveDateString()
  CertEndDate  = $req.ServicePoint.Certificate.GetExpirationDateString()
 }
}

$myCertificateStamps|format-list *
  
$myCertificateStamps[0].url
$myCertificateStamps[0].CertEndDate
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Erzesel  01.03.2022, 20:28

ps: falls jetzt die Frage der Gültigkeitsprüfung aufkommen sollte...

Datumangaben sind vergleichbar. (basierend auf den Variablen des Letzten Codelistings:

$myCertificateStamps|%{
  $_.url
  if ((get-date $_.CertEndDate) -lt (get-date)){
    write-host 'abgelaufen' -f red
  }
  else {
    write-host ('gueltig bis {0}'-f $_.CertEndDate) -f green
  }
}
0
Lukmon22 
Fragesteller
 07.03.2022, 11:41
@Erzesel

Moin Erzesel, kannst du dir meine neuste Powershell frage anschauen ? Du hast mir bisher immer sehr gut geholfen! :D

0
Lukmon22 
Fragesteller
 02.03.2022, 10:26
Exception calling "Create" with "1" argument(s): "Value cannot be null.
Parameter name: requestUri"
At line:2 char:2
+  $req = [Net.HttpWebRequest]::Create($_.link)
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException
 
You cannot call a method on a null-valued expression.
At line:3 char:2
+  $req.GetResponse() >$Null
+  ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
You cannot call a method on a null-valued expression.
At line:4 char:2
+  [PSCustomObject]@{
+  ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Exception calling "Create" with "1" argument(s): "Value cannot be null.
Parameter name: requestUri"
At line:2 char:2
+  $req = [Net.HttpWebRequest]::Create($_.link)
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException
 
You cannot call a method on a null-valued expression.
At line:3 char:2
+  $req.GetResponse() >$Null
+  ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
You cannot call a method on a null-valued expression.
At line:4 char:2
+  [PSCustomObject]@{
+  ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Cannot index into a null array.
At line:14 char:1
+ $myCertificateStamps[0].url
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray
 
Cannot index into a null array.
At line:15 char:1
+ $myCertificateStamps[0].CertEndDate
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

So sieht meine Fehlermeldung aus, wenn ich an meine csv datei verlinke mit deiner Methode. Muss ich noch etwas ändern statt dem Pfad ?

0
Erzesel  02.03.2022, 10:55
@Lukmon22

Aber Dir ist schon klar, das die Anordnung/Namen der Felder in Deiner csv ganz anders sein kann als in meiner Demo? Das musst Du natürlich selbst anpassen.

Ich habe nicht umsonst in den ersten beiden Codeblöcken gezeigt wie man mit verschiedenen CSV-Typen verfährt.

+ $req = [Net.HttpWebRequest]::Create($_.link)

naklar... ich rufe in der Demo (Butter bei die Fische) das csv als Datei mit Haeder auf.

In der Hoffnung das du kapiert hast wie man generell ein csv behandelt. Hast Du überhaupt begriffen was in der Pipevariable $_ übergeben wird? und wo die Felder eines Objekts, welches Import-Csv übergibt herkommen?

und natürlich hagelt es Fehlermeldungen wenn bereits beim 1.Schritt eine Variable keinen oder den falschen Wert/Typ hat.

bevor Du mit Requests herumrödelst, sollte erstmal die Basis sitzen. Du must ersmal lernen wie eine Pipeline funktioniert, wie Foreach-Objekt (%{...}) arbeitet.

Ich habe nicht umsonst die ersten Beiden Demos so unterschiedlich geschrieben... (ich erwarte dann das der Fragesteller allein vergleicht und einen Aha-Effect hat...

0
Lukmon22 
Fragesteller
 02.03.2022, 11:26
@Erzesel

Alles gut, hatte einige Gedankenfehler. Deine sachen klappen alle soweit, danke auf jeden fall!!.

Nur hab ich in der csv datei nicht nur eine Spalte sondern mehrere, dementsprechend mehrere url`s. Dein Skript gibt zurzeit nur die erste url wieder. Gibt es (z.B. mit ForEach) eine möglichkeit das zu berücksichtigen ?

0
Von Experte Erzesel bestätigt
Woher ich das weiß:eigene Erfahrung – Ich habe selber lange im PC gearbeitet