Bloqueando o Windows pelo Delphi
Muitas vezes precisamos restringir o acesso à algumas funções do Windows, como painel de controle, ou até mesmo de desligar o Windows. Tudo isso pode ser feito através de configurações no registro do Windows.
O Registro do Windows nada mais é do que um banco de dados que armazena informação sobre suas configurações. Esse banco de dados pode ser utilizado por qualquer aplicação, por exemplo você pode utilizar o registro do windows para armazenar a string de conexão de um banco de dados ou a última posição de uma determinada janela de seu aplicativo.
Acessando o Registro do Windows
O Delphi encapsulou toda a rotina de manipulação ao registro em uma classe chamada TRegistry que está localizada na Unit Registry. Veja na listagem 1 um exemplo de como utilizar a classe TRegistry.
Listagem 1. Exemplo do Help do Delphi sobre como usar TRegistry
function GetRegistryValue(KeyName: string): string;
var
Registry: TRegistry;
begin
Registry := TRegistry.Create(KEY_READ);
try
Registry.RootKey = HKEY_LOCAL_MACHINE;
Registry.OpenKey(KeyName, False);
Result := Registry.ReadString('VALUE1');
finally
Registry.Free;
end;
end;
A função acima permite que seja lido o valor contido na chave passada como parâmetro. Eu particularmente considero o uso do registro do windows um pouco perigoso porque o acesso a suas chaves é todo através de string, portanto se durante a execução passamos uma valor que não existe, não vamos obter o valor esperado ou podemos criar uma nova chave desnecessária.
Os segredos do registro
Digamos que você precise “esconder” o botão desligar do menu Iniciar. Para a maioria dos usuários comuns do windows isso já seria suficiente para “entrarem em pane”. Então vamos lá inicie uma nova aplicação e em seu formulário principal acrescente dois botões com os respectivos textos “Esconder botão Desligar” e “Trazer botão Desligar”, veja Figura 1.
Figura 1. Aplicação exemplo
Para fazer o que precisamos devemos incluir no registro do windows, exatamente na localização HKEY_Current_User/Software/Microsoft/Windows/CurrentVersion/Policies dentro da chave Explorer um novo valor “secreto” do tipo DWORD de nome NoClose. O valor NoClose poderá conter apenas um número que é 0 (falso, desligado) ou 1 (verdadeiro, ligado) .
Crie um método conforme a listagem 2, lembrando de acrescentar à clausula Uses a unit Registry.
Listagem 2. Método que irá alterar o registro
procedure TForm1.RemoverBotaoDesligar(SimNao: Boolean);
const
Registro = '\Software\Microsoft\Windows\CurrentVersion\Policies\';
Chave = 'Explorer\';
YesNo : array[False .. True] of Word = (0, 1);
begin
with TRegistry.Create do
try
RootKey:=HKEY_CURRENT_USER;
if OpenKey(Registro + Chave, True) then
WriteInteger('NoClose',YesNo[SimNao]);
CloseKey;
finally
Free;
end;
end;
No botão “Esconder...” chame nosso método passando parâmetro True, e no botão “Trazer...” chame o método com parâmetro False. Execute a aplicação clique no primeiro botão, reinicie ou efetue um Logoff e veja o resultado.
Existem algumas outras chaves, na tabela 1 vemos algumas delas, lembrando que a chave raiz é HKEY_Current_User/Software/Microsoft/Windows/CurrentVersion/Policies
Subchave /Explorer | |
Valor |
Descrição |
NoRun |
Desabilita o comando “Executar” do menu Iniciar |
NoLogoff |
Desabilita o “Logoff” da janela de segurança |
NoClose |
Desabilita o botão “Desligar” do menu Iniciar |
NoDesktop |
Desabilita os ícones da área de trabalho |
NoFind |
Desabilita o comando “Procurar” do menu Iniciar |
NoControlPanel |
Desabilita o Painel de Controle |
Subchave /Network | |
NoFileSharingControl |
Desabilita os controles de compartilhamento de arquivos |
NoPrintSharing |
Desabilita os controles de compartilhamento de impressoras |
Tabela 1. Algumas chaves ocultas
Conclusão
Vimos que o registro do Windows é uma base de dados da qual podemos utilizar em nossas aplicações, além disso, ele esconde alguns “segredos” que, se conhecidos, podem otimizar e/ou restringir o uso do sistema operacional. Infelizmente esses segredos não são documentos, mas nada que um tempo de pesquisa no Google não resolva.
Abraço e até a próxima.