Manipulando o registro do Windows com Ruby

Postador por Tiago Damasceno

Feed
Assine nosso Feed ou receba os artigos por email

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 chavenome_valor e valor serão utilizadas em todos nossos exemplos.

RUBY:

  1. require 'win32/registry'
  2.  
  3. chave = 'Software\TesteRubyRegistry'
  4. nome_valor = 'VersaoRuby'
  5. valor = '1.8.6'
  6.  
  7. #cria um nova chave
  8. Win32::Registry::HKEY_CURRENT_USER.create(chave) do |regkey|
  9.   #escreve o valor
  10.   regkey.write(nome_valor, Win32::Registry::REG_SZ, valor)
  11.  
  12.   #para escrever o valor poderia também ser utilizado:
  13.   #regkey[nome_valor, Win32::Registry::REG_SZ] = valor
  14. end

No exemplo 1 chamamos a constante Win32::Registry::HKEY_CURRENT_USER com o métodocreate, passando variável chave, o que significa que será criada a chaveHKEY_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

RUBY:

  1. #define o nivel de acesso da chave, apenas para leitura
  2. nivel_acesso = Win32::Registry::KEY_READ
  3.  
  4. #abre um chave
  5. Win32::Registry::HKEY_CURRENT_USER.open(chave, nivel_acesso) do |regkey|
  6.  
  7.   # o método Win32::Registry.read retorna um array,
  8.   # contendo o tipo do valor e o valor atual
  9.   tipo, valor_atual = regkey.read(nome_valor)
  10.  
  11.   #para retornar o valor atual poderia também ser utilizado:
  12.   #valor_atual = regkey[nome_valor]
  13.  
  14.   #exibe o valor lido
  15.   puts "Versao do Ruby: #{valor_atual}"
  16. end

Exemplo 3: Modificando um valor

RUBY:

  1. #definindo um novo valor a variável
  2. valor = '1.8.5'
  3.  
  4. #define o nivel de acesso da chave para escrita
  5. nivel_acesso = Win32::Registry::KEY_WRITE
  6.  
  7. #abre um chave
  8. Win32::Registry::HKEY_CURRENT_USER.open(chave, nivel_acesso) do |regkey|
  9.  
  10.   #modifica o valor
  11.   regkey.write(nome_valor, Win32::Registry::REG_SZ, valor)
  12.  
  13.   #para alterar o valor poderia também ser utilizado:
  14.   #regkey[nome_valor, Win32::Registry::REG_SZ] = valor 
  15. end

Exemplo 4: Excluindo um valor

RUBY:

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

Exemplo 5: Excluindo uma chave

1ª forma

RUBY:

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

2ª forma

RUBY:

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

0 comentários:

Postar um comentário