2017-10-18 8 views
0

私のWebサーバーのIISにバインドされた証明書が有効期限に近づくと、電子メールを送信するスクリプトを作成中です。私は電子メールでそれを送るためのスクリプトを持っています。私が知る必要があるのは、ストアクエリで利用可能な証明書と現在使用されている証明書を比較する方法だけです。現時点では、ここに私が持っているものがあります:Powershellスクリプトは、現在リモートでIISの有効期限切れの証明書を検索します。

$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 

何か助けと提案があります。ありがとう!

答えて

0

同じコンピュータに別々のセッションで変数を作成しているので、上記のスクリプトは機能しません。

あなたは2つの方法でそれを行うことができます。

  1. 宛先サーバーを1回ターゲットとするセッションオブジェクトを作成して再利用します。したがって、後でInvoke-commandの実行でセッションで定義された変数を取得できるようになります。

  2. セッションオブジェクトを作成せずに、リモートサーバー上のすべてを単一のInvoke-Commandで実行することによって、

例: -

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

} 

あなたがcertiricatesを識別した後、リモート・サーバー上の任意の更なるアクションは有効期限を持っていない場合、私は2番目のオプションを使用することをお勧めします。

+0

サーバーごとに1つの 'Invoke-Command'を作成する必要がありますか? – Didge

+0

@Didgeさんが追加した例 –

+0

今すぐ取得します。混乱して申し訳ありません。しかし、私は 'IIS:\ SslBindings'にアクセスできないと思います。私はいつも「ドライブが見つかりません」というエラーを受けました。 'IIS'という名前のドライブは存在しません。 これは、エラーが発生した部分です。 'Get-ChildItem -Path IIS:\ SslBindings' – Didge

0

@PRASOON私は既に証明書を遠隔からチェックすることができました。私はgoogleで見つけた別の参考文献を使って作業しようとしています。とにかく、ここにスクリプトがあります。

$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 

これは基本的に、これは正確にまたは30日以内に期限が切れる証明書を表示します。私がやっていることは、スクリプトが現在の日付から30日後に失効し、電子メール通知を送る証明書を検出したときに電子メールを送信することです。私は別のポストでそれについて懸念しています。

関連する問題