Manipulando o registro do Windows com Ruby

Um dia desses precisei escrever um script para manipular o registro do Windows para que eu pudesse altenar entre diferentes configurações do Rational ClearCase para acessar diferentes repositórios de diferentes servidores, e para agilizar meu trabalho utilizei a linguagem Ruby.

Para aqueles que gostaram da alternativa, veja abaixo como é simples essa manipulação, mostrarei as operações básica que também são as mais utilizadas. Para ficar mais didático, explicarei em parte e com pequenos exemplos.

A versão do Ruby para Windows possui a classe Win32::Registry, que permite justamente a manipulação do registro do Windows, e para utilizá-lo basta apenas escrever require ‘win32/registry’. Para enteder melhor os exemplos abaixo, vamos ver alguns conceitos importantes:

  • Registro: é uma espécie de banco de dados, onde são armazenadas as informações sobre todos os programas instalados, estrutura de diretórios, informações do usuário, de drivers, etc
  • Chave: é a estrutura básica do registro do Windows, são como pastas utilizada para a organização e armazenamento de valores. O Windows possui basicamente 5 chaves:
    • HKEY_CLASSES_ROOT – sua finalidade é manter compatibilidade com programas antigos, que rodam a 16 bits;
    • HKEY_CURRENT_USER – ela mostra somente informações do usuário atual do sistema, como configurações personalizadas, etc;
    • HKEY_LOCAL_MACHINE – esta é a chave mais importante do Registro, pois nela é que estão as informações sobre programas e hardware. Para se ter noção da importante desta chave, seus dados são guardados num arquivo chamado system.dat.
    • HKEY_USERS – no Windows é possível ter vários usuários num único computador e a função desta chave é guardar informações de cada um deles.
    • HKEY_CURRENT_CONFIG – contém configurações do usuário atual do computador relativas ao hardware.
  • Valor: são como variáveis, que recebe um nome e armazenam valores que podem ser do tipo:
    • REG_SZ – Valor da seqüência
    • REG_BINARY – Valor binário
    • REG_DWORD – Valor Double Word
    • REG_MULTI_SZ – Valor de seqüência múltipla
    • REG_EXPAND_SZ – Valor de seqüência expansível

Com os conceitos básicos em mente, vamos aos exemplos:

Exemplo 1: Criando um chave e adicionando um valor
As variáveis chave, nome_valor e valor serão utilizadas em todos nossos exemplos.

require 'win32/registry'
 
chave = 'Software\TesteRubyRegistry'
nome_valor = 'VersaoRuby'
valor = '1.8.6'
 
#cria um nova chave
Win32::Registry::HKEY_CURRENT_USER.create(chave) do |regkey|
  #escreve o valor
  regkey.write(nome_valor, Win32::Registry::REG_SZ, valor)
 
  #para escrever o valor poderia também ser utilizado:
  #regkey[nome_valor, Win32::Registry::REG_SZ] = valor
end

No exemplo 1 chamamos a constante Win32::Registry::HKEY_CURRENT_USER com o método create, passando variável chave, o que significa que será criada a chave HKEY_CURRENT_USER\Software\TesteRubyRegistry.

A chave criada foi instaciada dentro de regkey, o qual chamamos o método write, passando o nome do valor (nome_valor), o tipo do valor (Win32::Registry::REG_SZ) e o seu contéudo (valor), para que seja escrito o valor VersaoRuby com o conteúdo 1.8.6.

Os demais exemplos seguem a mesma lógica e os detalhes estão comentados no próprio código.

Exemplo 2: Lendo um valor

#define o nivel de acesso da chave, apenas para leitura
nivel_acesso = Win32::Registry::KEY_READ
 
#abre um chave
Win32::Registry::HKEY_CURRENT_USER.open(chave, nivel_acesso) do |regkey|
 
  # o método Win32::Registry.read retorna um array,
  # contendo o tipo do valor e o valor atual
  tipo, valor_atual = regkey.read(nome_valor)
 
  #para retornar o valor atual poderia também ser utilizado:
  #valor_atual = regkey[nome_valor]
 
  #exibe o valor lido
  puts "Versao do Ruby: #{valor_atual}"
end

Exemplo 3: Modificando um valor

#definindo um novo valor a variável
valor = '1.8.5'
 
#define o nivel de acesso da chave para escrita
nivel_acesso = Win32::Registry::KEY_WRITE
 
#abre um chave
Win32::Registry::HKEY_CURRENT_USER.open(chave, nivel_acesso) do |regkey|
 
  #modifica o valor
  regkey.write(nome_valor, Win32::Registry::REG_SZ, valor)
 
  #para alterar o valor poderia também ser utilizado:
  #regkey[nome_valor, Win32::Registry::REG_SZ] = valor
end

Exemplo 4: Excluindo um valor

#define o nivel de acesso da chave para escrita
nivel_acesso = Win32::Registry::KEY_WRITE
 
#abre um chave
Win32::Registry::HKEY_CURRENT_USER.open(chave, nivel_acesso) do |regkey|
  #exclui o valor
  regkey.delete_value(nome_valor)
end

Exemplo 5: Excluindo uma chave

1ª forma

#true define exclusão recursiva
Win32::Registry::HKEY_CURRENT_USER.delete_key(chave, true)

2ª forma

#define o nivel de acesso da chave para escrita
nivel_acesso = Win32::Registry::KEY_WRITE
 
#abre a chave Software
Win32::Registry::HKEY_CURRENT_USER.open('Software', nivel_acesso) do |regkey|
  #exclui a chave TesteRubyRegistry
  regkey.delete_key('TesteRubyRegistry')
end


Últimos tweets

    Artigos similares

    4 Comentários para “Manipulando o registro do Windows com Ruby”

    Deixe uma resposta