Delphi - Excluindo um registro do windows variável

|

Todo mundo já deve conhecer sobre a manipulação de registros do Windows através do Delphi, então o que eu vou mostrar é um exemplo prático do que você pode fazer.

Conteúdo dessa postagem:
- Listar pastas de uma determinada chave de registro.
- Buscar através de uma lista de pastas, uma pasta com um caracter coringa.
- Verificar existência de uma chave de registro.
- Excluir uma chave de registro.

Antes de mais nada, temos que declarar a biblioteca Registry no projeto.
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, StdCtrls, Registry;

Já declarada, você poderá manipular variáveis do tipo TRegistry, vou colocar a procedure inteira mas você pode parametrizar ela conforme a sua necessidade.
A procedure abaixo apaga um determinado registro fixo no programa, mas o problema é que a primeira chave é variável, ou seja, não tem como passar um caminho fixo para excluir o registro.
A solução foi executar um loop, buscando pelo caracter coringa, até encontrar o registro a excluir.

Raiz: HKEY_USERS
Chave: S-1-5-21-xxxxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xxxx\Software\SimonTatham\putty\SshHostKeys\
onde xxxxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xxxx é variável de computador para computador.
procedure ApagaRegistrosWindows;
var i : integer;
    RegWin : TRegistry;
    achou, fim : boolean;
    Chaves : TStringList;
begin
   RegWin := TRegistry.Create; // Chama o construtor do objeto
   RegWin.RootKey := HKEY_USERS; // seta raiz do registro

   Chaves := TStringList.Create; // cria uma stringlist para referência
   RegWin.OpenKey('', False); // abre a pasta da raiz caso exista
   RegWin.GetKeyNames(Chaves); // associa as pastas para a stringlist

   // inicializa variáveis
   i := 0;
   achou := false;
   fim := false;

   while ((not achou) and (not fim)) do
   begin
      // busca a chave que contém 'S-1-5-21' e não contenha a palavra 'Classes'
      if ((Pos('S-1-5-21', Chaves.Strings[i]) > 0) and (Pos('Classes', Chaves.Strings[i]) = 0)) then
         achou := true
      else if i = Chaves.Count-1 then // se estiver no último registro, termina
         fim := true
      else Inc(i); // se não encontrar, incrementa o contador
   end;

   if achou = true then
   begin
      // facilitando a vida do programador
      Chaves.Strings[i] := Chaves.Strings[i] + '\Software\SimonTatham\PuTTY\SshHostKeys';

      // verifica se o registro existe
      if RegWin.KeyExists(Chaves.Strings[i]) then
         RegWin.DeleteKey(Chaves.Strings[i]); // apaga o registro se existir
   end;

   RegWin.CloseKey; // Fecha a chave e o objeto
   RegWin.Free; // Libera o registro da memória
   Chaves.Free; // Libera a stringList da memória
end;