it-swarm-ja.com

PowerShellを使用してネットワークディレクトリから複数の.cer(証明書)をインストールしますが、最初にそれらがすでにインストールされているかどうかを確認します

私はまだPowerShellの方法を学んでいて、問題を解決するのに苦労しています。

次のロジックフローが必要です。

  1. \ fileserver\certsに移動し、そこにある各.cerファイルのすべての拇印を引き出します。
  2. ローカル証明書に対してリモート拇印のリストを実行します:\拇印の場所リスト
  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コードと、プロキシ設定などを変更するものがあります。

つまり、1つのcerを取り、それをローカルマシンに適用します。ユーザーが管理者でない場合は、管理者としてスクリプトを再起動するように求められます。これをforeach方式でスケールアウトして、cerが特定のネットワークディレクトリに追加されたときに、スクリプトが起動時に通知し、新しい証明書のインストールを試みるようにするつもりです。ユーザーが管理者でない場合は、新しい証明書をインストールする必要がある場合にのみプロンプトが表示されます。

まだPowerShellを学習しているので、どんな支援も大歓迎です!

1
Tucker

.cerファイルから拇印を取得する最も簡単な方法は、PowerShellで証明書オブジェクトを作成し、その中に証明書をインポートすることです。その後、PowerShellに拇印を含むオブジェクトを表示させることができます。

このようなもの:

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