.NET - Determinando o Dono (Owner) de um arquivo ou pasta
Hoje vou mostrar como podemos determinar qual o proprietário de um arquivo ou pasta no sistema operacional Windows usando o VB .NET e o C#.
O NTFS (New Technology File System) é o sistema de arquivos padrão para o Windows NT e seus derivados, sendo uma evolução do FAT. Ele possui uma estrutura que armazena as localizações de todos os arquivos e diretórios, incluindo os arquivos referentes ao próprio sistema de arquivos denominado MFT (Master File Table).
Dessa forma quando usamos o NTFS, cada arquivo e pasta possui um dono (owner) que é um usuário ou grupo que possui direitos especiais sobre o recurso como a habilidade de definir permissões.
Em um sistema NTFS o dono do arquivo é geralmente o usuário que criou o arquivo, embora possamos modificar isso usando o próprio Windows.
Para saber quem é o proprietário de um arquivo ou pasta basta selecionar o arquivo/diretório e clicar com o botão direito do mouse e a seguir clicar em Propriedades:
Você verá a janela Propriedades de Dados:
Clique na guia Segurança e a seguir no botão Avançadas para obter a janela que exibe o proprietário do arquivo ou pasta e algumas informações adicionais, e ainda o link para alterar o proprietário:
O que vou fazer neste artigo é mostrar como obter o dono de um arquivo ou pasta via código usando C# e VB .NET.
Para realizar essa tarefa vamos precisar usar os recursos do namespace System.Security.
Os namespaces do System.Security contêm classes que representam as permissões e o sistema de segurança do .NET Framework.
Os namespaces filho desse namespace fornecem tipos que controlam e auditam objetos protegíveis de auditoria, permitem autenticação, fornecem serviços de criptografia, controlam o acesso a operações e recursos baseados em uma política e oferecem suporte ao gerenciamento de direitos do conteúdo criado pelo aplicativo.
Dentre esses namespaces filhos vamos usar:
1- O namespace System.Security.AccessControl fornece elementos de programação que controlam o acesso e faz a auditoria em ações relacionadas à segurança em objetos que podem ser protegidos;
2- O namespace System.Security.Principal define um objeto principal que representa o contexto de segurança sob a qual o código está sendo executado;
Criando a solução no VS 2015 e os projetos VB .NET e C#
Selecione Other Project Types e clique em Visual Studio Solution e selecione Blank Solution;
Informe o nome Obtendo_Dono_Recurso e clique em ok;
A seguir no menu File clique em Add -> New Project ;
Selecione Visual C# -> Windows e marque o template Windows Forms Application;
Informe o nome Dono_Recurso_CSharp;
Selecione Visual Basic -> Windows e marque o template Windows Forms Application;
Informe o nome Dono_Recurso_VBNET;
Dessa forma teremos 1 solução contendo um projeto Visual Basic e um projeto C# que iremos desenvolver e usar no artigo.
No formulário do projeto inclua os seguintes controles a partir da ToolBox:
TextBox - txtRecurso
Button - btnObterDono
TextBox - txtDono
No formulário vamos declarar os seguintes namespaces:
No evento Click do botão - Obter Dono do Recurso - vamos incluir o código abaixo:
private void btnObterDono_Click(object sender, EventArgs e)
FileAttributes attr = File.GetAttributes(txtRecurso.Text);
if (attr.HasFlag(FileAttributes.Archive))
if (!File.Exists(txtRecurso.Text))
MessageBox.Show("O arquivo informado não existe.");
if (!Directory.Exists(txtRecurso.Text))
MessageBox.Show("O diretório informado não existe.");
FileSecurity fileSecurity = File.GetAccessControl(txtRecurso.Text);
txtDono.Text = ntAccount.Value.ToString();
Na primeira parte do código apenas verificamos o atributo do recurso para determinar se é um arquivo ou diretório e a seguir verificamos se o mesmo existe:
!File.Exists(txtRecurso.Text)...
No interior do bloco try/catch temos o código que vai efetivamente fazer o trabalho que desejamos :
1 - Inicialmente usamos a classe FileSecurity que representa as opções de segurança para um arquivo ou pasta. Podemos criar um objeto FileSecurity usando o método GetAccessControl() que é um método estático que requer um argumento string que especifica o caminho do item a ser examinado no nosso caso o nome do arquivo ou pasta informado na caixa de texto txtRecurso.Text.
2 - Após isso usamos o objeto FileSecurity criado para definir um objeto IdentityReference que é uma classe que trata dos detalhes de segurança para um usuário ou grupo. Para isso chamamos o método GetOwner() que inclui o parâmetro que aceita o objeto que desejamos gerar. Passamos também o tipo SecurityIdentifier :
3 - O tipo IdentityReference inclui o identificador de segurança (SID) para o usuário ou grupo proprietário do recurso. Para obter o nome do proprietário precisamos traduzir o identityReference para um objeto NTAccount.
Embora NTAccount seja uma subclasse de IdentityReference, o objeto que criamos não é uma NTAccount. Para fazer a conversão usamos o método Translate. Este método requerer que seja especificado o tipo alvo para a conversão, no exemplo, informamos NTAccount.