Back-End

20 nov, 2017

C# – Bloqueando e desbloqueando pastas

Publicidade

Neste artigo irei apresentar uma aplicação feita na linguagem C# que bloqueia e desbloqueia uma pasta selecionada.

Atenção: Ao testar o programa, utilize uma pasta do sistema que não é importante para você, pois dependendo do ambiente, você poderá ter problemas para reverter a operação.

O programa que bloqueia e desbloqueia pastas apresentado neste artigo utiliza o CLSID para bloquear pastas do sistema.

O CLSID é apenas um ID com o qual o Windows determina o comportamento de um objeto, ou seja, como um arquivo deve se comportar como um arquivo, uma pasta como um conjunto de arquivos ou um atalho, como um link para um arquivo ou pasta.

Alterar ou adicionar um CLSID à uma pasta ou objeto, altera seu comportamento; de certa forma, o sistema é enganado e passa a acreditar que este é um objeto privado do sistema, como: ‘A lixeira’, ‘O Computador’, etc.

Abaixo temos uma lista contendo alguns CLSID:

“{645FF040-5081-101B-9F08-00AA002F954E}” = “Cesta de Lixo”
“{21EC2020-3AEA-1069-A2DD-08002B30309D}” = “Painel de controle”
“{208D2C60-3AEA-1069-A2D7-08002B30309D}” = “Meus locais de rede”
“{BD84B380-8CA2-1069-AB1D-08000948F534}” = “Fontes”
“{7007ACC7-3202-11D1-AAD2-00805FC1270E}” = “Conexões de rede”
“{D6277990-4C6A-11CF-8D87-00AA0060F5BF}” = “Tarefas programadas”

Convertendo pastas para objetos COM.

Como isso funciona? Como podemos bloquear as pastas?

Simplesmente vamos enganar o sistema de forma que nossa pasta se torne um objeto do sistema, ou seja, vamos fazer do acesso à nossa pasta, um acesso real à um objeto do sistema. Como o acesso a ‘Computador’. E não importa como você tente acessar os arquivos, será sempre enviado para o acesso ao objeto.

As etapas para realizar essa proeza, são:

  1. Acessar a pasta
  2. Renomear a pasta
  3. Adicionar no final do nome, o ‘.CLSID’. Ex: nome_da_pasta..{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}

Ao final, você verá o ícone da pasta alterado e a pasta bloqueada.

Recursos usados:

Criando o projeto Windows Forms

Abra o VS 2017 Community e crie um novo projeto (File-> New Project) usando a linguagem Visual C# e o template Windows Classic Desktop ->Windows Forms Application(.NET Framework).

Informe um nome a seu gosto. Eu vou usar o nome LockFolder.

Abra o formulário Form1.cs e inclua, a partir da Toolbox, dois Buttons com Name igual a btnBloque e btnDesbloquear:

Veja abaixo o layout do formulário:

Nos eventos Click dos botões de comando btnBloquear e btnDesbloquear, inclua o código a seguir:

private void btnBloquear_Click(object sender, EventArgs e)
        {
            BloquearPasta();
        }
        private void btnDesbloquear_Click(object sender, EventArgs e)
        {
            DesBloquearPasta();
        }

Em cada evento Click estamos chamando a respectiva função para bloquear e desbloquear a pasta selecionada.

A seguir temos o código do método BloquearPasta():

private void BloquearPasta()
        {
            FolderBrowserDialog fbdBloqueaPasta = new FolderBrowserDialog();
            if (fbdBloqueaPasta.ShowDialog() == DialogResult.OK)
            {
                DirectoryInfo dInfo = new DirectoryInfo(fbdBloqueaPasta.SelectedPath);
                string caminhoArquivo = dInfo.FullName;
                string nomeArquivo = caminhoArquivo.ToString() + ".{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}";
                try
                {
                    Directory.Move(caminhoArquivo.ToString(), nomeArquivo.ToString());
                    MessageBox.Show("Pasta :: BLOQUEADA ::  com sucesso!");
                }
                catch
                {
                    MessageBox.Show("Erro! Tente outra pasta.", "Importante", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
                    return;
                }
            }

Abaixo, o código do método DesbloquearPasta:

private void DesBloquearPasta()
        {
            FolderBrowserDialog fbdBloqueaPasta = new FolderBrowserDialog();
            if (fbdBloqueaPasta.ShowDialog() == DialogResult.OK)
            {
                DirectoryInfo PastaInfo = new DirectoryInfo(fbdBloqueaPasta.SelectedPath);
                string caminhoArquivo = PastaInfo.FullName;
                string nomeArquivo = caminhoArquivo.ToString().Replace(".{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}", "");
                try
                {
                    Directory.Move(caminhoArquivo.ToString(), nomeArquivo.ToString());
                    MessageBox.Show("Pasta DESBLOQUEADA com Sucesso!");
                }
                catch
                {
                    MessageBox.Show("Erro! Tente outra pasta.", "Importante", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
                    return;
                }
            }
        }

Neste código apenas removemos o CLSID adicionado ao nome da pasta.

Vamos implementar a chamada aos métodos se o usuário pressionar a tecla B de bloquear e D de desbloquear:

private void Lock_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode.ToString() == "B")
            {
                BloquearPasta();
            }
            if (e.Control && e.KeyCode.ToString() == "D")
            {
                DesBloquearPasta();
            }
        }

Executando o projeto, iremos obter o seguinte resultado:

1. Clicando em Bloquear e selecionando a pasta
2. A mensagem de pasta bloqueada
3. A pasta selecionada agora bloqueada

Pegue o código do projeto aqui: LockFolder.zip

Até o próximo artigo!