tradução

Editando o Registro do Windows em Python com o _winreg

Primeiramente, um alerta aos leitores do blog: este artigo a seguir é um artigo de programação. Fala sobre recursos da linguagem de programação Python. Se você não é programador, nem gosta dessas coisas, pode continuar visitando o blog (tá acompanhando Warning Zone?), apenas pule este post, que foi traduzido do artigo de Mike Driscoll, do blog Mouse vs. Python


A biblioteca padrão de Python é conhecida por incluir vários módulos e pacotes práticos, que podem ser usados sem necessidade de instalar nada mais. Esta é uma das principais razões de a bibliotca padrão ser frequentemente referenciada como "baterias incluídas". Assim, não deve ser surpresa o fato de o Python incluir um módulo só para Windows, que permita editar o Registro do Windows. Esse módulo em particular recebe o estranho nome de _winreg (estranho devido ao sublinhado no início). Neste artigo, aprenderemos como começar a trabalhar com o Registro usando essa bateria.

Lendo o Registro

Usar o Python para ler dados a partir do registro é muito fácil. No exemplo a seguir, procuraremos pelo caminho onde o Outlook Express está instalado:

from _winreg import *
key = OpenKey(HKEY_LOCAL_MACHINE, r'Software\Microsoft\Outlook Express', 0, KEY_ALL_ACCESS)
QueryValueEx(key, "InstallRoot")

Na minha máquina, isso retorna a seguinte tupla: (u’%ProgramFiles%\\Outlook Express’, 2). A tupla combina o valor do registro com o tipo de valor. Há dois outros métodos de consulta que podem ser chamados: QueryInfoKey e QueryValue. O primeiro lhe dá informações internas sobre a chave em si, na forma de três inteiros; enquanto o último recupera apenas o dado para o primeiro valor da chave que tenha nome NULL. A documentação recomenda que você use QueryValueEx sempre que possível.

Devemos explicar rapidamente o que está acontecendo no código anterior. A função OpenKey recebe uma constante HKEY*, uma string de caminho da subchave, um inteiro reservado (que precisa ser igual a zero) e a máscara de segurança. Neste caso, passamos KEY_ALL_ACCESS, que nos dá controle total daquela chave. Como tudo o que fizemos foi ler a chave, provavelmente deveríamos ter utilizado KEY_READ ao invés da outra constante. Já quanto ao QueryValueEx, ele recebe somente o objeto chave e o nome do campo que queremos consultar.

Escrevendo no Registro

Se você andou lendo o blog do Mike ultimamente, provavelmente já viu o módulo _winreg sendo utilizado para escrita no registro. Isso será apenas revisto por você, assim fique à vontade para pular esta sessão. Começaremos com um exemplo prático. No código a seguir, vamos definir a página inicial do Internet Explorer. Como sempre, favor notar que a edição de entradas no Registro pode ser muito perigosa. Esteja certo de ter feito backup do seu registro antes de tentar editá-lo. Agora, que comece o espetáculo!

keyVal = r'Software\Microsoft\Internet Explorer\Main'
try:
    key = OpenKey(HKEY_CURRENT_USER, keyVal, 0, KEY_ALL_ACCESS)
except:
    key = CreateKey(HKEY_CURRENT_USER, keyVal)
SetValueEx(key, "Start Page", 0, REG_SZ, "http://bardo.ws/")
CloseKey(key)

No código acima, tentamos abrir a seguinte chave: HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main e definir o valor “Start Page” para este blog. Se a abertura falha, isso geralmente é devido ao fato de a chave não existir, assim tentamos criá-la no nosso manipulador de exceção. Então usamos SetValueEx para definir o valor e, como todo bom programador, nós fechamos a chave a partir do momento em que não precisaremos mais manuseá-la. Se você pulou o comando CloseKey, o fato de o programa ser feito em Python fará com que o Python o feche para você. Porém, se você continuar trabalhando nesta chave, você pode ter uma violação de acesso ao tentar abrí-la com ela já aberta. Assim, a lição que fica é que sempre feche uma chave quando terminar de mexer nela.

Outros Métodos do _winreg

Há vários outros métodos na biblioteca _winreg além dos que foram mostrados. O método DeleteKey é prático quando você precisa remover uma chave. Infelizmente, tenho passado por ocasiões em que preciso remover chaves recursivamente, como acontece numa desinstalação, e o _winreg ainda não tem uma forma embutida de fazer isso. Você pode escrever o seu próprio, é verdade, ou pode baixar um wrapper que faça isso por você, como o YARW (Yet Another Registry Wrapper).

DeleteValue é similar ao DeleteKey, exceto que você apaga apenas um valor. Sim, isso é bem óbvio. Se você quer escrever seu próprio código de eliminação recursiva, provavelmente vai querer dar uma olhada na forma como EnumKey e EnumValue enumeram as chaves e valores, respectivamente. Vamos ver então como usar o EnumKey:

from _winreg import EnumKey, HKEY_USERS
 
try:
    i = 0
    while True:
        subkey = EnumKey(HKEY_USERS, i)
        print subkey
        i += 1
except WindowsError:
    # WindowsError: [Errno 259] No more data is available    
    pass

O código acima irá percorrer todo o HKEY_USERS, imprimindo as subchaves na saída padrão até que termine e um WindowsError seja gerado. Realmente este código não desce para as subchaves, mas deixarei essa tarefa como um exercício para o leitor que quiser praticar.

O último método de que iremos falar aqui é o ConnectRegistry. Ele é útil quando nós precisamos editar o Registro de uma máquina remota. Ele só aceita dois argumentos: o nome do computador e a chave à qual se conectar (por exemplo, HKEY_LOCAL_MACHINE). Note que quando conectamos máquinas remotas, nós só podemos editar certas chaves, enquanto outras estão indisponíveis.

Encerrando

Espero que este artigo tenha sido útil para você e tenha lhe dado um montão de ideias para projetos futuros. Eu tenho muitos scripts de login que usam essa maravilhosa biblioteca, e um par que usa o YARW. Tem sido muito útil até agora e eu espero que também seja para você.

Leia Também

Subscribe to RSS - tradução

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll: cannot open shared object file: No such file or directory in Unknown on line 0