Questão Novo no powershell e meu foreach continua falhando. Tentando iterar em uma lista de arquivos cert, mas ele falha. Provavelmente simples


Problema:

Quando eu importo um certificado individualmente, fora de um foreach, ele imprime a impressão digital conforme necessário; no entanto, preciso iterar por meio de uma lista de arquivos .cer em um compartilhamento de arquivos para que eu possa executá-los nos certificados instalados atualmente de uma máquina local. No momento em que tento executar a lista de certs pelo meu foreach, ele falha.

Código de trabalho (individualmente)

<# 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

Eu estou tentando escalar esse código de trabalho em um foreach para iterar sobre uma lista ou arquivos .cer. Abaixo está minha tentativa até agora.

Código de falha:

$certGetList = Get-ChildItem -Path \\fileserver\...\Certs

$certGetList | ForEach-Object {
    $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
    $cert.Import($_)
    $cert.Thumbprint
}

Mensagem de erro

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


origem


você vê alguma coisa se você simplesmente colocar Write-Host $_ no começo do seu foreach? - EBGreen
Sim, imprime o arquivo na iteração atual antes de imprimir a mensagem de erro. Exemplo: "cert1.cer" + mensagem de erro e, em seguida, "cert2.cer" + mensagem de erro. A mensagem de erro mostrada acima, na verdade, aparece para cada iteração que falha. - Tucker
Eu também tentei importar $ _ como uma string via .import ("$ _"), mas resultou no mesmo erro. Estou totalmente perplexo neste momento. - Tucker


Respostas:


Claro ... tão simples.

Responda:

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

De alguma forma, ele perde a origem do objeto e tenta encontrar o arquivo relativo localmente, em vez de no compartilhamento de rede. Eu precisava explicitamente direcioná-lo para o compartilhamento de rede para cada iteração.


1