28

I am writing a PowerShell script to get a list of certificates which are getting expired within 30 days. The script is working, but the problem is there are too many app and pres servers, and I want to minimize the script code. My function is:

function CheckCert($ComputerNames)
{
    $deadline = (Get-Date).AddDays($global:threshold) # Set deadline date
    Invoke-Command -ComputerName $ComputerNames { Dir Cert:\LocalMachine\My } |
        foreach {
            If ($_.NotAfter -le $deadline)
            {
                $_ | Select Issuer, Subject, NotAfter, @{Label="Expires In (Days)";Expression={($_.NotAfter - (Get-Date)).Days}}
            }
        }
}

And I am calling this function like:

Switch ($xMenu1)
{
    1 {CheckCert -ComputerNames "CUKIRUNCSVR0242"}
    2 {CheckCert}
    3 {CheckCert}
    ...

I want to pass ComputerNames like serv1, serv2, serv3 and this number of servers cound vary from 1 to 6 depending upon the option selected from menu. **OR Can I define a list of servers of different envirinments and pass the list name as parameter and modify my CheckCert function to loop through for each server and get the expired certificate details?

Switch ($xMenu1)
{
    1 {CheckCert -ComputerNames CIT_envList}
    2 {CheckCert -ComputerNames SIT_envList}
    3 {CheckCert -ComputerNames Prod_envList}
    ...

And their server lists are something like:

CIT_envList = serv1, serv2

SIT_envList = serv1, serv2, serv3,

PROD_envList = serv1, serv2, serv3, serv4
1
  • Invoke-command can take an array of computernames as an argument. Commented Feb 1, 2020 at 23:19

2 Answers 2

37

Try this:

function CheckCert([string[]]$ComputerNames)
{
    $deadline = (Get-Date).AddDays($global:threshold) # Set deadline date
    foreach ($computer in $ComputerNames)
    {
        Invoke-Command -ComputerName $Computer { Dir Cert:\LocalMachine\My } |
        foreach {
            If ($_.NotAfter -le $deadline)
            {
                $_ | Select Issuer, Subject, NotAfter, @{N="Expires In (Days)";E={($_.NotAfter - (Get-Date)).Days}}
            }
        }
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

is it possible to pass values in the variable $ComputerNames="adf","fdf","sdffd","adsfad",adsfasf" like this?
3

Working with PS 4.0 or later, it´s possible to define as CheckCert([array]$ComputerNames) as well.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.