Установите несколько .cer (сертификатов) из сетевого каталога с помощью powershell, но сначала проверьте, установлены ли они уже

657
Tucker

Я все еще изучаю способы 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 и некоторые другие вещи, которые изменяют настройки прокси и т. Д.

Короче говоря, он берет один сертификат и применяет его к локальной машине. Если пользователь не является администратором, он предлагает перезапустить сценарий от имени администратора. Я намереваюсь масштабировать это методом foreach, чтобы при добавлении сертификата в конкретный сетевой каталог скрипт запускался и пытался установить новый сертификат. Если пользователь не является администратором, он запрашивает ТОЛЬКО, когда ему нужно установить новый сертификат.

Все еще учусь PowerShell, поэтому любая помощь будет принята с благодарностью!

1

1 ответ на вопрос

1
Kage

Самый простой способ извлечь отпечаток из файла .cer - создать объект сертификата в powershell и импортировать сертификат в него. После чего вы можете использовать PowerShell для отображения объекта, включая отпечаток большого пальца.

Что-то вроде этого:

$cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $cer.Import("PathToCer\cabundle.crt") $cer.Thumbprint 
Ты сделал это. Спасибо большое Кейдж! Tucker 6 лет назад 0