如何使用Powershell脚本将SSL证书过期数据导出到Excel工作表

如何使用Powershell脚本将SSL证书过期数据导出到Excel工作表,powershell,Powershell,我编写了一段代码,其中将使用Powershell脚本将所有SSL证书详细信息导出到excel工作表,但在输出窗口中,我需要包括服务器名称在内的详细信息,如下所示: 代码 $deadline = (Get-Date).AddDays($threshold) #Set deadline date Invoke-Command -ComputerName AAA, BBB { Dir Cert:\LocalMachine\My } | foreach { If ($_.NotAfter

我编写了一段代码,其中将使用Powershell脚本将所有SSL证书详细信息导出到excel工作表,但在输出窗口中,我需要包括服务器名称在内的详细信息,如下所示:

代码


$deadline = (Get-Date).AddDays($threshold)   #Set deadline date 

Invoke-Command -ComputerName AAA, BBB { Dir Cert:\LocalMachine\My } | foreach { 
  If ($_.NotAfter -le $deadline) { $_ | Select Issuer, Subject, ServerName, NotAfter, @{Label="Expires In (Days)";Expression={($_.NotAfter - (Get-Date)).Days}} } 
} | Export-Csv -Path C:\users\$env:username\desktop\Multiplecert_results.csv -NoTypeInformation -Force```

**Output**
*Issuer            : CN=MS-Organization-P2P-Access [2019]
Subject           : CN=742833b2-8a94-400a-8bbc-ded50dfd3f1a, 
                    DC=8d894c2b-238f-490b-8dd1-d93898c5bf83
ServerName        : 
NotAfter          : 1/21/2020 10:03:43 PM
Expires In (Days) : 0*

I need the Server name details in the above output when i run the Script which i wrote.

Thanks in Advance.

只需在代码中使用$env:COMPUTERNAME。 也不需要那个循环,因为您可以在调用中这样做。你可以通过这样做来简化这件事

Invoke-Command -ComputerName 'aaa', 'bbb' { 
    Get-ChildItem -Path 'Cert:\LocalMachine\My' | 
    Select-Object -Property Issuer, Subject, 
}

# Results
Issuer         : ...
Subject        : ...
PSComputerName : ...
RunspaceId     : ...
插入$env将使您获得两次名称

Invoke-Command -ComputerName 'aaa', 'bbb' { 
    Get-ChildItem -Path 'Cert:\LocalMachine\My' | 
    Select-Object -Property Issuer, Subject, 
    @{Label = 'ServerName';Expression = {$env:COMPUTERNAME}}
}

# Results
Issuer         : ...
Subject        : ...
ServerName     : ...
PSComputerName : ...
RunspaceId     : ...
至于这个

“我试过这样做,但代码不起作用,”

这意味着什么,因为你没有说/显示什么不起作用? 此外,当您需要显示代码时,请始终更新原始帖子,而不是将其放在评论部分

$threshold = 300 #Number of days to look for expiring certificates 
$deadline = (Get-Date).AddDays($threshold) #Set deadline date 
再说一遍,不要这样做…

。。。因为您正在请求远程服务器调用之外的数据(ForEach)

这样做…

至于

我剧本中的最后一个疑问是我有一个标签要在几天内到期, 我怎样才能在你的脚本中包含它来获得到期日

。。。证书到期这是多年来常见且有充分证明的事情。您在该过期部分使用了错误的运算符

见本文:

那么,您的代码是这样的

至于这个

当我尝试上面的脚本时,你建议在 第一天

。。。这样试试看

Clear-Host

Invoke-Command -ComputerName 'aaa', 'bbb' { 
    Get-ChildItem -Path 'Cert:\LocalMachine\My' -Recurse | 
    Select-Object -Property Issuer, Subject, NotAfter, 
    @{Label = 'ServerName';Expression = {$env:COMPUTERNAME}}, 
    @{Label='Expires In (Days)';Expression = {(New-TimeSpan -Start (Get-Date) -End $PSitem.NotAfter).Days}} 
}

# Results

...

Issuer            : CN=M...
Subject           : CN=M...
NotAfter          : 5/9/2021 7:28:13 PM
ServerName        : aaa
Expires In (Days) : 474
PSComputerName    : aaa
RunspaceId        : 9...

Issuer            : CN=Th...
Subject           : CN=Th...
NotAfter          : 12/31/2020 6:59:59 PM
ServerName        : aaa
Expires In (Days) : 344
PSComputerName    : aaa
RunspaceId        : 9...
...

但是,当我在Invoke命令中使用多个服务器时,我在运行脚本的标签中得到的是服务器名称,而不是服务器名称,这是因为在远程命令调用完成后,您需要获取信息。这就是为什么我将对数据的调用直接放在Invoke中。如果您使用我在响应中提供的示例,您应该在每次传递中获得服务器名称。同样,不需要那个外部循环,那个调用,因为服务器列表是一个隐式循环。我在我的一个实验室做了这个调用,所以,我知道它会返回corect名称和其他值。这样做,看看我的意思-Invoke命令-ComputerName'aaa',bbb'{$env:ComputerName}感谢您的清晰解释,我得到了预期的输出。我脚本中的最后一个疑问是,我有一个标签可以在天内获得到期日,我如何在脚本中包含该标签以获得到期日。与您在循环中的做法相同。获取ForEach中的所有内容,并将其移动到Invoke中,然后在其中添加您需要的任何其他内容。再说一次,这个FoREach并不是真正需要的。
Invoke-Command -ComputerName 'aaa', 'bbb' { 
    Get-ChildItem -Path 'Cert:\LocalMachine\My' | 
    Select-Object -Property Issuer, Subject 
    @{Label = 'ServerName';Expression = {$env:COMPUTERNAME}}, 
    @{Label='Expires In (Days)';Expression = {($_.NotAfter - (Get-Date)).Days}} 
}
Get-ChildItem -Path cert: -Recurse -ExpiringInDays 75
Get-ChildItem -Recurse | 
where { $_.notafter -le (get-date).AddDays(75) } | 
select thumbprint, subject
Invoke-Command -ComputerName 'aaa', 'bbb' { 
    Get-ChildItem -Path 'Cert:\LocalMachine\My' | 
    Select-Object -Property Issuer, Subject 
    @{Label = 'ServerName';Expression = {$env:COMPUTERNAME}}, 
    @{Label='Expires In (Days)';Expression = {$_.notafter -le (get-date).AddDays($threshold)}} 
}
Clear-Host

Invoke-Command -ComputerName 'aaa', 'bbb' { 
    Get-ChildItem -Path 'Cert:\LocalMachine\My' -Recurse | 
    Select-Object -Property Issuer, Subject, NotAfter, 
    @{Label = 'ServerName';Expression = {$env:COMPUTERNAME}}, 
    @{Label='Expires In (Days)';Expression = {(New-TimeSpan -Start (Get-Date) -End $PSitem.NotAfter).Days}} 
}

# Results

...

Issuer            : CN=M...
Subject           : CN=M...
NotAfter          : 5/9/2021 7:28:13 PM
ServerName        : aaa
Expires In (Days) : 474
PSComputerName    : aaa
RunspaceId        : 9...

Issuer            : CN=Th...
Subject           : CN=Th...
NotAfter          : 12/31/2020 6:59:59 PM
ServerName        : aaa
Expires In (Days) : 344
PSComputerName    : aaa
RunspaceId        : 9...
...