Powershell Excluir remotamente certificados PKI

9

Recentemente, reconstruí minha PKI e gostaria de excluir os certificados que foram emitidos para todas as máquinas clientes na minha rede. Parece um trabalho para o Powershell! Então, eu escrevi esse script para ser distribuído pelo GPO, executado a partir do SysVol e acionado nas máquinas clientes na inicialização:

set-location cert:\LocalMachine\My
$certname = $env:COMPUTERNAME + ".domain.com"
get-item * | %{
if($_.issuer -like "CN=IssuingCA*" -and $_.DnsNameList.unicode -like $certname) { remove-item .\$_.Thumbprint -Force }
}

Em um prompt de comando elevado:

  • Quando Ran, o script não fornece saída (simplesmente uma nova linha de terminal). Ele não retorna erros e o certificado não é excluído.
  • Quando o argumento -WhatIfé adicionado ao Remove-Itemcomando no script, novamente não há erros e o Certificado não é excluído.
  • Quando Remove-Item. \ CERTIFICATE-THUMBPRINT -Force é executado, o certificado é excluído.

Isso é um problema de permissão? Existe uma maneira mais inteligente / simples de fazer isso?

Obrigado!

Byron C.
fonte
1
você tentou remove-item -whatif??
MDMoore313
@BigHomie. Sim, eu tentei isso. I parecem ter removido essa informação em uma edição ...
Byron C.
1
No seu código de bloqueio condicional, adicione a write-hostpara despejar algo na tela se o condicional for verdadeiro. Gostaria de saber se o script está avaliando como falso (explicaria o nenhum erro e nenhuma ação).
precisa saber é o seguinte
@ Colyn1337 Sim. Está avaliando True.
Byron C.
@ByronC. O que acontece se o código de bloqueio é justo Remove-Item -Force?
precisa saber é o seguinte

Respostas:

6

Minha resposta é para "Existe uma maneira mais inteligente / simples de fazer isso?" parte da sua pergunta. Este script foi bem-sucedido na remoção de um certificado go daddy para mim

$Path = 'Cert:\LocalMachine\AuthRoot\'
$CertList = @()

$CertList = Get-ChildItem -Path $Path | Where-Object {$_.Issuer -like "CN=GO*"}

foreach($Cert in $CertList){
    remove-item "$($Path)$($Cert.Thumbprint)" -Force -WhatIf
}

Eu adicionei um -WhatIfpara que esse código não fosse perigoso para o folx "copy \ paste \ run". Agora, você vai precisar para se adaptar a $Path, Where-Objecte adicione a $certnamevariável, mas o modelo acima deve ter-lo ir.

Colyn1337
fonte
3

Embora não tenha conseguido resolver o problema com o script, consegui encontrar uma maneira 'mais inteligente / mais simples' de atingir meu objetivo .

Da autoridade de certificação:

  • Clique com a tecla Rt Certificate Templatese selecioneManage
  • Rt-Clique no modelo de certificado que deseja substituir e selecione Reenroll All Certificate Holders

Isso aumentará o número da versão do modelo e os sistemas de rede com inscrição automática excluirão o certificado antigo e se inscreverão no novo certificado.

Embora isso exija a inscrição automática para o modelo específico em que estou trabalhando, uma solução para o script publicado seria uma resposta preferível.

Byron C.
fonte