特定应用程序部署的先决条件是,我们需要在安装之前在 PC 的 Windows 受信任发布者证书存储中安装特定的 PKI 证书。
有没有办法检测某个证书是否已经安装?最好使用一行命令或简短脚本(可用于先决条件检测,或作为 SCCM 2012 中的依赖项检查)?
似乎有很多命令和脚本可以列出所有已安装的证书,或所有已安装的即将过期的证书,但我看不到任何可以识别是否安装了某个特定证书的命令和脚本。
答案1
使用 PowerShell 单行命令即可实现,您只需要一种简单的方法来识别该证书(我正在使用该证书的 ThumbPrint)。
如果您已经有一台已知的机器,并且您知道它肯定安装了证书(最简单的交互式检查方式就是使用certmgr.msc
),那么您可以使用该机器来查找证书的指纹。
以下 PowerShell 命令将列出本地计算机上下文中受信任的发布者存储中安装的所有证书:
Get-ChildItem -Path Cert:\LocalMachine\TrustedPublisher
显然,可以修改上述路径以列出其他证书存储,或者您可以使用以下命令查看所有本地安装的证书(的长列表):
Get-ChildItem -Path Cert: -Recurse
第一个命令应该给你类似这样的输出:
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
找到所需证书的指纹后,可以使用它来过滤结果,如下所示:
Get-ChildItem -Path Cert:\LocalMachine\TrustedPublisher | Where-Object {$_.Thumbprint -eq "83EDC96EC3D55125EFFC77BC815F9133E268D5EB"}
如果已安装证书,则应返回证书的详细信息,如果未安装,则不返回任何内容。除其他用途外,此 Powershell 单行命令还可用作 SCCM 2012 应用程序中的自定义脚本检测方法。
(所用资源:使用 PowerShell 查找即将过期的证书|PowerTip:使用 PowerShell 发现证书指纹| 使用 Where-Object Cmdlet)