Новый для powershell, и мой foreach продолжает терпеть неудачу. Попытка перебрать список файлов сертификата, но это не удалось. Наверное просто

368
Tucker

Проблема:

Когда я импортирую сертификат индивидуально, вне foreach, он печатает отпечаток большого пальца по мере необходимости; однако мне нужно перебрать список файлов .cer на файловом ресурсе, чтобы я мог запускать их с установленными в настоящее время сертификатами локального компьютера. В тот момент, когда я пытаюсь запустить список сертификатов через мой foreach, он терпит неудачу.

Рабочий код (индивидуально)

<# Notice the explicite .cer file #> $certGet = Get-ChildItem -Path \\fileserver\...\Certs\cert.cer  $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $cert.Import($certGet) $cert.Thumbprint 

Я пытаюсь масштабировать этот рабочий код в foreach для перебора списка или файлов .cer. Ниже моя попытка до сих пор.

Неверный код:

$certGetList = Get-ChildItem -Path \\fileserver\...\Certs  $certGetList | ForEach-Object { $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $cert.Import($_) $cert.Thumbprint } 

Сообщение об ошибке

ERROR: Exception calling "Import" with "1" argument(s): "The system cannot find the file specified. ERROR: " list_thumbprints_test.ps1 (18, 2): ERROR: At Line: 18 char: 2 ERROR: + $cert.Import($_) ERROR: + ~~~~~~~~~~~~~~~~ ERROR: + CategoryInfo : NotSpecified: (:) [], MethodInvocationException ERROR: + FullyQualifiedErrorId : CryptographicException ERROR: 
0
Вы видите что-нибудь, если просто поместите `Write-Host $ _` в начале каждого foreach? EBGreen 6 лет назад 0
Да, он печатает файл в текущей итерации непосредственно перед печатью сообщения об ошибке. Пример: «cert1.cer» + сообщение об ошибке, а затем «cert2.cer» + сообщение об ошибке. Сообщение об ошибке, показанное выше, фактически появляется для каждой неудачной итерации. Tucker 6 лет назад 0
Я также попытался импортировать $ _ как строку через .import ("$ _"), но привел к той же ошибке. Я полностью озадачен в этом пункте. Tucker 6 лет назад 0

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

1
Tucker

Конечно ... так просто.

Ответ:

$cert.Import($certGetList + "\" + $_) 

Каким-то образом он теряет источник объекта и пытается найти соответствующий файл локально, а не в общей сетевой папке. Мне нужно было явно направить его на сетевой ресурс для каждой итерации.