如何检测特定证书是否已安装在 Windows 机器上?

GAT*_*awn 9 windows certificate

特定应用程序部署的先决条件是,在安装之前,我们需要在 PC 的 Windows Trusted Publishers 证书存储中安装特定的 PKI 证书。

有没有办法检测是否已经安装了特定的证书?理想情况下使用单行命令或简短脚本(可用于 pre-req 检测,或作为 SCCM 2012 中的依赖项检查)?

似乎有很多命令和脚本可以列出所有已安装的证书,或者所有已安装的证书即将到期,但我无法确定是否安装了某个特定证书。

GAT*_*awn 12

这可以通过 PowerShell one-liner 实现,您只需要一种简单的方法来识别该证书(我使用的是证书的 ThumbPrint)。

如果您已经有一台已知的机器,并且您知道它肯定安装了证书(交互检查的最简单方法是使用certmgr.msc),那么您可以使用该机器查找证书的指纹。

以下 PowerShell 命令将列出本地计算机上下文中受信任发布者存储中安装的所有证书:

Get-ChildItem -Path Cert:\LocalMachine\TrustedPublisher
Run Code Online (Sandbox Code Playgroud)

显然,可以修改上面的路径,以列出其他证书存储,或者您可以使用以下命令查看(一长串)所有本地安装的证书:

Get-ChildItem -Path Cert: -Recurse
Run Code Online (Sandbox Code Playgroud)

第一个命令应该为您提供如下输出:

PS C:\> Get-ChildItem -Path Cert:\LocalMachine\TrustedPublisher


    Directory:
    Microsoft.PowerShell.Security\Certificate::LocalMachine\TrustedPublisher


Thumbprint                                Subject
----------                                -------
83EDC96EC3D55125EFFC77BC815F9133E268D5EB  CN="User, Test", OU=Testing Resources...
4DFF713712084D43DE6879C689F9A143C4A793BF  CN=Server One Self-signed
Run Code Online (Sandbox Code Playgroud)

找到您要查找的证书的指纹后,您可以使用它来过滤结果,如下所示:

Get-ChildItem -Path Cert:\LocalMachine\TrustedPublisher | Where-Object {$_.Thumbprint -eq "83EDC96EC3D55125EFFC77BC815F9133E268D5EB"}
Run Code Online (Sandbox Code Playgroud)

如果已安装,则应返回证书的详细信息,如果未安装,则不返回任何内容。除其他用途外,此 Powershell one-liner 可用作 SCCM 2012 应用程序中的自定义脚本检测方法。

(使用的资源:使用 PowerShell 查找即将过期的证书| PowerTip:使用 PowerShell 发现证书指纹| 使用 Where-Object Cmdlet