Public/Get-SSLCertReport.ps1



function Get-SSLCertReport {

    <#
.SYNOPSIS
 Get SSL Cert report form Server
 
.DESCRIPTION
 This function will generate a report of SSL Certs from a Server or Servers
 
 .NOTE
  File Name : Get-SSLCertReport.ps1
  Author : Srini Vemulapalli
  Requires : PowerShell 5
 
  .EXAMPLE
 
    PS> Get-SSLCertReport -ComputerName <YourServerName> | ft
 
  .EXAMPLE
 
    PS> Get-SSLCertReport -ComputerName (get-content servers.txt) |ft
 
  .EXAMPLE
    
    PS> Get-SSLCertReport -ComputerName (get-content servers.txt) | Select-Object ComputerName, Status, NotAfter, Subject, Issuer, DaysRemaining, TimeStamp |
         Export-Csv ("Get-SSLCertReport.csv") -NoTypeInformation
  #>



    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true,
            ValueFromPipeline = $True,
            ValueFromPipelineByPropertyName = $True,
            HelpMessage = "This. Computer. Name.")]
        [Alias('HostName', 'cn', 'IPAddress')]
        [String[]]$ComputerName
    )

    BEGIN { 
        Write-Verbose "Script execution in Progress... Please wait" 
    }

    PROCESS {
        $User = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
        WriteLog "Script Execution in Progress....for $User" -Severity INFO
        $Max = $ComputerName.Count
        $Count = 1
        
        foreach ($computer in $ComputerName) {
            $Computer = $Computer.trim()

            try {
                Write-Verbose "-------------------------------"
                Write-Verbose "Retrieving data from $Computer"
                WriteLog ("Currently Processing Server: $Count " + "of " + $max + " " + $Computer)
                New-CimSession -ComputerName $Computer -ErrorAction Stop | out-null
                WriteLog "Gathering SSL Cert Details from $Computer" -Severity INFO
           
                if ($Env:ComputerName -eq $Computer) {
                    $certs = Get-ChildItem -Path "Cert:\LocalMachine\My" -Recurse | Select-Object NotAfter, Subject, Issuer
                }
                else {
                    $certs = Invoke-Command -ComputerName $Computer {
                        Get-ChildItem -Path "Cert:\LocalMachine\My" -Recurse | Select-Object NotAfter, Subject, Issuer
                    }
                }
                
                Foreach ($cert in $certs) {
                    $Date = Get-Date -Format "yyyyMM_dd_HH_mmss"
        
                    $issuer = ($cert.Issuer -split ",")[0].Trim()
                    $subject = ($cert.Subject -split ",")[0].Trim()
                    $daysRemaining = ($cert.NotAfter - (Get-Date)).Days
                    $Properties = [Ordered] @{ ComputerName = $Computer
                        Status                              = "Connected"
                        NotAfter                            = $cert.NotAfter
                        Subject                             = $subject
                        Issuer                              = $issuer
                        DaysRemaining                       = $daysRemaining
                        TimeStamp                           = [String]$Date 
                    }

                    $Objoutput = New-Object -TypeName PSObject -Property $Properties
                    Write-output $Objoutput

                } 
                
                
            
            }
            catch {
                    
                WriteLog $_.Exception.Message -Severity ERROR
                WriteLog "Unable to connect via WinRM to this Server $Computer" -Severity ERROR
                $Date = Get-Date -Format "yyyyMM_dd_HH_mmss"
                $Properties = [Ordered] @{ ComputerName = $Computer
                    Status                              = "NotConnected"
                    NotAfter                            = $null
                    Subject                             = $null
                    Issuer                              = $null
                    DaysRemaining                       = $null
                    TimeStamp                           = [String]$Date 
                }
                   
                $Objoutput = New-Object -TypeName PSObject -Property $Properties
                Write-output $Objoutput
            } 

            $Count = $Count + 1
        }# End foreach

    } #End PROCESS
         
    END {
        WriteLog "Script Execution Completed" -Severity INFO
    }
         
          
} # End function



function WriteLog {
      
    Param(
        [Parameter(Mandatory = $true)]
        [string]$Message,
        
        [Parameter(Mandatory = $false)]
        [ValidateSet('INFO', 'WARNING', 'ERROR')]
        [string]$Severity = 'INFO'
    )
    
    $CallStack = Get-PSCallStack
    $CallingFunction = $CallStack[1].Command

    if ($CallingFunction -eq '<ScriptBlock>') {
        $CallingFunction = "Module_MainScript"
    }
    
    $logDate = Get-Date -Format "yyyyMMdd"

    $LogFolder = "C:\Temp\Logs"
    if (-not (Test-Path $LogFolder)) { New-Item -ItemType Directory -Path $LogFolder | Out-Null }
    $LogFile = Join-Path $LogFolder ("$CallingFunction" + "_" + $logDate + ".log")
     
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $LogLine = "[$Timestamp] [$Severity] $Message"
     
    # Append to the dedicated log file
    $LogLine | Add-Content -Path $LogFile
    # $LogLine | Tee-Object -FilePath $LogFile -Append
              
} #End Sub Function (WriteLog)