2017-10-18 7 views
0

Je travaille actuellement sur un script qui enverra un email une fois que les certificats liés aux IIS de mes serveurs web arriveront à leur date d'expiration. J'ai le script pour l'envoyer par email. Tout ce que j'ai besoin de savoir, c'est comment comparer les certificats disponibles dans la requête magasin par rapport aux certificats actuellement utilisés. Pour l'instant, voici ce que j'ai:Script Powershell pour trouver des certificats expirés liés dans IIS à distance

$Date= (Get-Date) 
$SMTPServer = "smtp.test.com" 
$From = "[email protected]" 

Import-Module WebAdministration 

$Servers = @("WEBSERVER1", "WEBSERVER2") 

$certificates = foreach($server in $Servers){ 
    Invoke-Command -ComputerName $server -ScriptBlock { $CertAll = Get-ChildItem -Path Cert:\LocalMachine\My } 
    Invoke-Command -ComputerName $server -ScriptBlock { $CertInUse = Get-ChildItem -Path IIS:\SslBindings } 
    Invoke-Command -ComputerName $server -ScriptBlock { $CertSame = Compare-Object -ReferenceObject $CertAll -DifferenceObject $CertInUse -Property Thumbprint -IncludeEqual -ExcludeDifferent } 

    Invoke-Command -ComputerName $server -ScriptBlock { $cert = $CertSame | ForEach {Get-ChildItem -Path Cert:\LocalMachine\My\$($_.thumbprint)} | 
    Select-Object Subject, DaysUntilExpired, NotAfter, @{n='ExpireInDays';e={($_.notafter - ($Date)).Days}}} 
} 

    $certificates | Sort DisplayName 

Toute aide et suggestion seraient appréciées. Merci!

Répondre

0

Le script ci-dessus ne fonctionne jamais car vous créez des variables dans des sessions distinctes sur le même ordinateur.

Vous pouvez le faire de deux façons.

  1. Créez un objet de session ciblant le serveur de destination une fois et réutilisez-le. Ainsi, vous serez en mesure d'obtenir les variables définies dans la session lors des exécutions Invoke-command suivantes. Sans créer un objet de session, mais en exécutant tout sur le serveur distant dans un seul Invoke-Command.

exemple: -

Invoke-command -computerName $Server { 
    $CertAll = .... 
    $CertInUse = .... 
    $CertSame = .... 
    $cert = $CertSame | ForEach ..... | 
    Select-Object Subject, DaysUntilExpired ..... 

} 

si vous n'avez pas d'autres actions sur le serveur distant après avoir identifié les certiricates date d'expiration, je vous suggère d'utiliser la deuxième option.

+0

Dois-je créer un seul 'Invoke-Command' par serveur? – Didge

+0

@Didge exemple ajouté –

+0

Je l'ai maintenant. Désolé pour la confusion monsieur. Mais je pense que je ne peux pas accéder à 'IIS: \ SslBindings'. J'ai toujours eu l'erreur qui dit: «Impossible de trouver le lecteur. Un lecteur avec le nom 'IIS' n'existe pas. ' Ceci est la partie, que je pense, où j'ai eu l'erreur: 'Get-ChildItem -Path IIS: \ SslBindings' – Didge

0

@PRASOON J'ai déjà réussi à vérifier mes certificats à distance. J'essaie de travailler avec différentes références trouvées dans google. De toute façon, voici le script.

$Date = Get-Date 
$servers = Get-Content C:\servers.txt 

$cert = Foreach ($server in $servers) { 
    Invoke-Command -ComputerName $server -ScriptBlock{ 
     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 
         DnsNameList = $certificate.DnsNameList 
         NotAfter = $certificate.NotAfter 
         ExpireInDays = ($certificate.NotAfter - (Get-Date)).Days} 
       } 
      } 
     } 
    } 

$cert | Select PSComputerName, DnsNameList, NotAfter, ExpireInDays | Where-Object {$_.ExpireInDays -lt 30} | Out-File C:\results.txt 

Donc, fondamentalement, cela affichera les certficats qui expireront exactement ou dans les 30 jours à partir de maintenant. Je travaille toujours sur ceci parce que ce que j'essaye de faire est d'envoyer un email quand le manuscrit détecte un certificat qui expirera 30 jours de la date actuelle et enverra une notification d'email. Je vais demander mon inquiétude à ce sujet dans un autre post.