2017-05-04 4 views
1

Ich stelle ein Skript zusammen, das alle Webserverzertifikate überprüft, damit ich überwachen kann, wann sie ablaufen. Wenn das Skript die Invoke-Command auszuführen geht ich diese Störung erhalte:Warum schlägt mein Invoke-Befehl fehl?

Invoke-Command Error Message

Hier ist mein Code:

Import-Module WebAdministration 
$results = @() 
$ou = 'OU=test,OU=test,OU=Servers,DC=contoso,DC=com' 

$subtree = Get-ADOrganizationalUnit -SearchBase $ou -SearchScope Subtree -filter * | Select-Object -ExpandProperty DistinguishedName 

ForEach($dn in $subtree){ 
    $servers = Get-ADComputer -Filter * -SearchBase $dn | select Name 
    $results += $servers 
}#ForEach($dn in $subtree) 

$scriptBlock = [scriptblock]::Create({ 
    Import-Module WebAdministration; Get-ChildItem -Path IIS:SSLBindings | ForEach-Object -Process ` 
     { 
      If($_.Sites){ 
       $certificate = Get-ChildItem -Path CERT:LocalMachine/My | 
        Where-Object -Property Thumbprint -EQ -Value $_.Thumbprint 

        [PSCustomObject]@{ 
         Sites      = $_.Sites.Value 
         CertificateDNSNameList = $certificate.DnsNameList 
         CertificateNotAfter  = $certificate.NotAfter 
        }#[PSCustomObject] 
      }#If($_.Sites) 
     }#Import-Module 
})#ScriptBlock 

ForEach($server in $results){ 
    Invoke-Command -ComputerName $server -ScriptBlock $scriptBlock | Select Sites,CertificateDNSNameList,CertificateNotAfter,PSComputerName #ScriptBlock  
}#ForEach($server in $results) 

Jetzt, Wenn ich die folgende Zeile aus der Schleife nehmen und ersetzen $server mit einem tatsächlichen Servernamen, erhalte ich die Ergebnisse ich suche:

Invoke-Command -ComputerName ServerName -ScriptBlock $scriptBlock | Select Sites,CertificateDNSNameList,CertificateNotAfter,PSComputerName 

Irgendwelche Ideen, was ich falsch mache?

+2

gut, offensichtlich etwas falsch mit Ihrem Servernamen, überprüfen nur das Array Sie bekommen – 4c74356b41

+0

Ich sehe nicht, wo Sie definieren '$ Serverliste '. –

+0

@JeffZeitlin Ich entschuldige mich, dass ich nach dem Testen einer anderen Route zurück zu '$ results' gegangen bin. Ich habe den ursprünglichen Post bearbeitet. – T4RH33L

Antwort

2

Ihr Ergebnis-Array kein Array von String ist, ist es ein Array von Objekt. Jedes Objekt hat den Attributnamen. Ändern Sie Ihre letzte ForEach-Schleife in diesem und Ihr Skript funktioniert:

ForEach($server in $results){ 
    Invoke-Command -ComputerName $server.name -ScriptBlock $scriptBlock | Select Sites,CertificateDNSNameList,CertificateNotAfter,PSComputerName #ScriptBlock  
}#ForEach($server in $results) 
+0

Danke, mein Herr, das war mein Problem. – T4RH33L

2

Es sieht für mich wie "Select Name" ist ein Objekt zurückgegeben, anstatt eine Zeichenfolge. Versuchen Sie, die Linie zu ändern, die die Server diese abruft:

$servers = Get-ADComputer -Filter * -SearchBase $dn | select -ExpandProperty Name 
Verwandte Themen