C# - Bloqueando e desbloqueando Pastas


 

Neste artigo vou 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 desbloquei pasta 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 a 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

E como isso funciona ?  Como podemos bloquear as pastas ?

 

Simplesmente vamos enganar o sistema de tal forma que nossa pasta se torne um objeto do sistema, ou seja, vamos fazer o acesso à nossa pasta realmente um acesso a um objeto do sistema. Como o acesso a 'Computador' e não importa como você tenta acessar os arquivos serás sempre enviádo 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 leiaute 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...

"Se alguém quer vir após mim (Jesus), a si mesmo se negue, tome a sua cruz e siga-me" (Mateus 16:24).

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti