使用 powershell 从网络目录安装多个 .cer(证书),但首先检查它们是否已安装

使用 powershell 从网络目录安装多个 .cer(证书),但首先检查它们是否已安装

我仍在学习 powershell 的使用方法,在解决问题时遇到了困难。

我想要以下逻辑流程:

  1. 前往 \fileserver\certs 并提取其中每个 .cer 文件的所有指纹
  2. 根据本地证书运行远程指纹列表:\location 指纹列表
  3. 如果由于缺少指纹而未在本地安装 .cer,请将 .cer 从 \fileserver\certs 安装到 cert:\location

中间还有一点逻辑,但总的来说这就是我想要实现的。我的主要问题是从远程 .cer 文件中提取指纹,或者确定它们是否以不同的方式在本地安装(据我所知,指纹是最合乎逻辑的方式,但我完全愿意接受建议)。

每次运行脚本时,我都可以安装目录下的每个证书,但我担心会产生不必要的开销,而且最主要的是每次运行时都需要管理员权限,而不是在首次启动或检测新证书时。

主要问题是我无法从 .cer 文件中收集指纹,而 Google 的建议到目前为止毫无用处。如果我能弄清楚如何从远程 .cer 中提取指纹,我相当肯定我可以弄清楚从那时起所需的 foreach 逻辑。

我当前的代码:

#Add certificate to local trusted store
$certCheckLocation = "Cert:\LocalMachine\Root\(Cert Thumbprint...)"
$certPutLocation = "Cert:\LocalMachine\Root\"
$certFile = (Get-ChildItem -Path \\server\file.cer)
$certCheckFile = (Test-Path -Path $certCheckLocation)

if ($certCheckFile -eq $false) {

        If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
        {
            $messageBox.Popup("Please run as an admin.",5,"Proxy Utility",0)
            Break
        } else {
            $certFile | Import-Certificate -CertStoreLocation $certPutLocation
        }
}

下面是 GUI 代码和一些改变代理设置等的内容。

简而言之,它获取单个 cer 并将其应用于本地计算机。如果用户不是管理员,它会提示他们以管理员身份重新启动脚本。我打算以 foreach 方式扩展它,以便当将 cer 添加到特定网络目录时,脚本会在启动时注意到并尝试安装新证书。如果用户不是管理员,它只会在需要安装新证书时提示。

仍在学习 powershell,因此非常感谢任何帮助!

答案1

从 .cer 文件中提取指纹的最简单方法是在 powershell 中创建一个证书对象,然后将证书导入其中。之后,您就可以让 powershell 显示包含指纹的对象。

像这样:

$cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cer.Import("PathToCer\cabundle.crt")
$cer.Thumbprint

相关内容