2017-11-06 2 views
-1

여기에 다른 웹 서버의 IIS에서 바인딩 된 인증서에서 필요한 정보를 반환하는 스크립트가 있습니다.PSCustomObject에서 반환 한 ExpiryInDays 데이터가 30보다 작거나 같으면 PowerShell에서 전자 메일 알림을 트리거합니다.

$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 

이 출력이 메모장의 모습입니다 :

PSComputerName DnsNameList NotAfter    ExpireInDays 
-------------- ----------- --------    ------------ 
ComputerName  {URL.com}  1/1/2050 11:59:59 PM   11744 

이 지원 세부 인증서의 긴 목록을 반환합니다. 내가해야 할 일은 인증서의 세부 사항을 30 일 이내에 다른 TXT 파일로 보내서 내용을 파싱하거나 전자 메일 알림에 파일 자체를 첨부하는 것입니다.

이 스크립트를 해결하거나 단순화 할 수있는 다른 방법이 있다고 생각되는 경우 매우 권장 사항을 제시합니다. 미리 감사드립니다. 나는 비슷한 작업에 사용하는 스크립트에서 가져온이 같은

+0

[Send-MailMessage] (https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/Send-MailMessage?view=powershell-5.1) – TheIncorrigible1

+0

글쎄, 나는 패스해야한다. PSCustomObject에서 반환 된 데이터 ExpireInDays 열의 값을 확인하여 전자 메일 경고를 트리거해야합니다. 나는 이메일 알림을 만드는 방법을 알고 있습니다. 나는 VBscript와 PowerShell에서 그것을 할 수있다. – Didge

+0

'If ($ Cert.ExpireInDays -lt $ condition) {...} ' – TheIncorrigible1

답변

0

시도 뭔가가, 당신이 정말로 첨부 파일로 결과를해야하는 경우

# Note: It's usually better to filter with Where-Object and then Select-Object 
$ExpiringCerts = $cert | Where-Object { $_.ExpireInDays -lt 30 } | Select-Object -Properties PSComputerName, DnsNameList, NotAfter, ExpireInDays; 

if ($ExpiringCerts) { 
    $MailSettings = @{ 
     SmtpServer = 'smtp.example.com'; 
     Port = 25; 
     UseSsl = $false; 
     Subject = 'Subject Line'; 
     To = '[email protected]','[email protected]' 
     From = '[email protected]'; 
     Body = $ExpiringCerts | ConvertTo-Html -As Table -Fragment | Out-String; 
     BodyAsHtml = $true; 
    }; 

    Send-MailMessage @MailSettings; 
} 

, 다음 출력을 파일로 저장하고 Send-MailMessage-Attachment 매개 변수를 사용하십시오. 보통 전자 메일 본문을 사용하는 이러한 종류의 통지는 훨씬 더 의미가 있습니다.

+0

고마워요.하지만 전자 메일을 보내는 스크립트를 작성하는 방법을 알고 있습니다. 필자가해야 할 일은'Foreach' 문, 특히 ExpireInDays 열의 출력을 확인한 다음 ExpireInDays 값이 30 이하인 전체 행을 선택하는 것입니다. 'if ($ _. ExpireInDays -le 30) {...}'라고 쓰십시오. 해당 열의 데이터를 구문 분석하고 조건이 충족되는 경우 데이터 행을 반환 할 수있는 방법이 있습니까? – Didge

+0

@Didge 그런 다음 사람이 읽을 수있는 표 형식의 텍스트 파일에 저장하지 마십시오. 그건 전혀 쓸모가 없어. 'Export-Csv','Import-Csv','ConvertTo-Json','ConvertFrom-Json','Export-Clixml'과'Import-Clixml'과 같은 직렬화 명령을 사용하십시오. 'ConvertTo-Json'과'Export-Clixml'은 기본 데이터 형의 일부 또는 전부를 보존 할 수 있습니다. 그러나 왜 데이터를 30 일로 필터링해야하는지 이해할 수 없습니다. 기존 스크립트가 이미 그렇게합니다. –

+0

방금 ​​찾았을 때 효과가 있다고 생각합니다. 귀하의 제안을 사용하여 작동하게하면 알려 드리겠습니다. 고마워! – Didge

관련 문제