Supprimer à distance les certificats PKI de Powershell

9

J'ai récemment reconstruit mon PKI et je voudrais supprimer les certificats qui ont été émis pour toutes les machines clientes de mon réseau. Cela ressemble à un travail pour Powershell! J'ai donc écrit ce script pour être distribué par GPO, exécuté à partir de SysVol et déclenché sur les machines clientes au démarrage:

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

À partir d'une invite de commande élevée:

  • Lorsque Ran, le script ne donne aucune sortie (simplement une nouvelle ligne de terminal). Il ne renvoie aucune erreur et le certificat n'est pas supprimé.
  • Lorsque l'argument -WhatIfest ajouté à la Remove-Itemcommande dans le script, à nouveau aucune erreur et le certificat n'est pas supprimé.
  • Lorsque Remove-Item. \ CERTIFICATE-THUMBPRINT -Force est exécuté, le certificat est supprimé.

Est-ce un problème d'autorisations? Existe-t-il un moyen plus intelligent / plus simple de procéder?

Merci!

Byron C.
la source
1
as-tu essayé remove-item -whatif??
MDMoore313
@BigHomie. Oui, j'ai essayé ça. Il me semble avoir supprimé ces informations dans une modification ...
Byron C.
1
Dans votre bloc de code conditionnel, ajoutez un write-hostpour vider quelque chose à l'écran si le conditionnel est vrai. Je me demande si le script est évalué comme faux (expliquerait l'absence d'erreur et aucune action).
Colyn1337
@ Colyn1337 Yep. Il évalue True.
Byron C.
@ByronC. Que se passe-t-il si le bloc de code est juste Remove-Item -Force?
Colyn1337

Réponses:

6

Ma réponse est pour le "Y a-t-il un moyen plus intelligent / plus simple de le faire?" une partie de votre question. Ce script a réussi à supprimer un certificat go daddy pour moi

$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
}

J'ai ajouté un -WhatIfafin que ce code ne soit pas dangereux pour le folx "copier \ coller \ exécuter". Maintenant, vous devrez adapter le $Path, Where-Objectet ajouter la $certnamevariable, mais le modèle ci-dessus devrait vous y aider.

Colyn1337
la source
3

Bien que je n'aie pas été en mesure de résoudre le problème avec le script, j'ai pu trouver un moyen «plus intelligent / plus simple» d'atteindre mon objectif .

De l'autorité de certification:

  • Rt-Click Certificate Templateset sélectionnezManage
  • Rt-Cliquez sur le modèle de certificat que vous souhaitez remplacer et sélectionnez Reenroll All Certificate Holders

Cela augmentera le numéro de version du modèle et les systèmes réseau avec auto-inscription supprimeront l'ancien certificat et s'inscriront avec le nouveau certificat.

Bien que cela nécessite une inscription automatique pour le modèle spécifique avec lequel je travaille, une solution au script publié serait une réponse préférable.

Byron C.
la source