2017-10-18 9 views
0

현재 웹 서버의 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

위의 스크립트는 동일한 컴퓨터에 대해 별도의 세션에서 변수를 만들 때 결코 작동하지 않습니다.

두 가지 방법으로 수행 할 수 있습니다.

  1. 대상 서버를 대상으로 세션 개체를 한 번 만들고 다시 사용하십시오. 따라서 후속 Invoke-command 실행에서 세션에 정의 된 변수를 가져올 수 있습니다.

  2. 세션 개체를 만들지 않고 원격 서버의 모든 항목을 단일 Invoke-Command에서 실행하여 만듭니다.

예 : -

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

} 

당신이 certiricates를 식별 한 후 원격 서버에 어떤 추가 작업이 날짜가 만료되지 않은 경우, 내가 두 번째 옵션을 사용하는 것이 좋습니다 것입니다.

+0

서버 당 하나의'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 일 후에 만료되고 전자 메일 알림을 보낼 인증서를 발견하면 전자 메일을 보내는 것입니다. 나는 다른 게시물에서 그 것에 대한 나의 우려를 물을 것이다.