Automatisch bestimmte Zertifikate auf Computern löschen

icon-13Es kann vorkommen, dass aufgrund eines Problems mit einer Zertifikatsvorlage alle Zertifikate davon auf den Clients gelöscht werden sollen, um einen sauberen Stand auf den Computern zu haben.

Dazu habe ich eine kleine Batchdatei geschrieben, das alle Zertifikate im Computerstore ausliest und anhand der Seriennummer die Vorlage des Zertifikates ermittelt. Stimmt der Name der Vorlage mit dem angegebenen Vorlagenname (hier Vorlagename) überein, dann wird es gelöscht.

Die Batchdatei kann man mit Hilfe einer Gruppenrichtlinie oder einer Softwareverteilung an die Clients verteilen.

 

————————– hier ausschneiden ——————————

@echo off

setlocal ENABLEDELAYEDEXPANSION

rem Aktuelle Zertifikate im My-Store ausgeben (beinhaltet auch den COmputer Store)

certutil -store my > %temp%\store.tmp

rem durch das ergebnis durchgehen

for /f "delims=: tokens=1,*" %%a in (%temp%\store.tmp) do (

  rem seriennummer des aktuellen zertifikates zwischenspeichern

  if %%a.==Seriennummer. (

    set seriennummer=%%b

  )

  rem anhand ausgabe der vorlage erkennen ob es eine bestimmte Vorlage hat

  if %%a.==Vorlage. (

    echo %%a | findstr /i "Vorlagenname"

    if ERRORLEVEL 0 (

       certutil -delstore my !seriennummer!     

    )

    set seriennummer=

  )

)

del %temp%\store.tmp

Endlocal

————————– bis hier ausschneiden ——————————

This entry was posted in Windows and tagged , , , , . Bookmark the permalink.

7 Responses to Automatisch bestimmte Zertifikate auf Computern löschen

  1. chris says:

    Hey,

    nettes script erstmal danke dafuer.

    leider sind meine Batch skills arg eingerostet

    wieso werden die Variablen via %% angesprochen und was bedeutet der . dahinter?

    Bin da bei das script fuer meine Faelle unzustricken, dazu muss ich nach Serial Number Suchen. Muss dazu der Delims und der Token angepasst werden?

    Ware voll nett wenn du mir das erklaeren koenntest oder eine url parat hast wo das ganze besprochen wird.

    Danke

    chris

  2. markus says:

    @chris
    Hi,
    die Variablen werden per %%a angesprochen, da die cmd im ersten Durchlauf alles mit %a ersetzen würde, und dann gäbs die nicht mehr. %%a wird somit nach dem Ersetzen ein normales %a sein.
    Der Punkt hinter der Variable ist für den Vergleich notwendig. Wenn die Variable leer ist, würde das if Statement falsch sein, da die Variable wieder nur durch den Text ersetzt wird: “if ==blabla”. Durch den Punkt (oder irgendwas anderes) bleibt auf jeden Fall if .==blabla.
    Bei einem englischen System sollte ein Ersetzen durch Serial Number reichen. Falls nicht einfach eine Beispielausgabe anhängen.

    Viel Erfolg

    Markus

  3. chris says:

    Hey Danke fuer die schnelle Antwort..

    ich bin zu bloed ohne debugger komme ich nicht klar

    Ausgabe

    my
    ================ Certificate 0 ================
    Serial Number: 7f5c678f000100004edc
    Issuer: CN=xyz, DC=abc, DC=net
    NotBefore: 11/23/2011 10:44 AM
    NotAfter: 11/22/2012 10:44 AM
    Subject: CN=xxx.zzz.net
    Certificate Template Name (Certificate Type): Machine
    Non-root Certificate
    Template: Machine, Computer
    Cert Hash(sha1): 99 ac 76 69 45 fa 25 ed de d1 ea c9 30 43 8c 43 ed a7 06 7f
    Key Container = 9eefc1efdcxxxxxxxx1fddf_126c3772-206b-yyyy-84b5-50a523cfa1fd
    Provider = Microsoft RSA SChannel Cryptographic Provider
    Encryption test FAILED
    CertUtil: -store command completed successfully.

    Hier meine Aenderung

    @echo off

    setlocal ENABLEDELAYEDEXPANSION

    rem Aktuelle Zertifikate im My-Store ausgeben (beinhaltet auch den COmputer Store)

    certutil -store my > store.tmp

    rem durch das ergebnis durchgehen

    for /f “delims=: tokens=1,*” %%a in (store.tmp) do (

    rem seriennummer des aktuellen zertifikates zwischenspeichern

    if %%a.==Serial Number. (

    set seriennummer=%%b

    )

    rem anhand ausgabe der vorlage erkennen ob es eine bestimmte Vorlage hat

    if %%a.==Template. (

    echo %%a | findstr /i “Machine, Computer”

    if ERRORLEVEL 0 (

    rem certutil -delstore my !seriennummer!
    echo Gefunden
    )

    set seriennummer=

    )

    )

    rem del store.tmp

    Endlocal

  4. chris says:

    Hey,

    ich bins noch mal

    also wenn ich das script wie oben beschrieben ausfuehre passiert nix. Ich komme nie in den ERRORLEVEL 0

    Danke schonmal

    Chris

    • markus says:

      So. Jetzt hatte ich endlich mal Zeit mir dein Beispiel anzuschauen. Keine Ahnung ob du es noch benötigst , aber das Problem liegt in dem Leerzeichen bei Serial Number. Wenn man aus der Zeile
      if “%%a”==”Serial Number” (
      macht, dann funktioniert das Skript (wenigstens bei mir mit deinen Ausgaben). In diesem Fall braucht man kein . mehr, da wir jetzt ja ” haben

      Grüße

      Makrus

  5. Chris says:

    Super vielen Dank schonmal, werde is dann Morgen gleich mal testen.

    Viele Grüße

    Chris

  6. chris says:

    Super das wars! Vielen Vielen Dank

Leave a Reply to chris Cancel reply