.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;

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando a solução no VS 2015 e os projetos VB .NET e C#

Abra o VS 2015 Community  e clique em New Project;

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;

A seguir no menu File clique em Add -> New Project ;

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:

Disponha os controles no formulário conforme o leiaute abaixo:

No formulário vamos declarar os seguintes namespaces:

using System;
using
System.Windows.Forms;
using
System.IO;
using
System.Security.AccessControl;
using
System.Security.Principal;

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.");
                    return;
                }
            }
            else
            {
                if (!Directory.Exists(txtRecurso.Text))
                {
                    MessageBox.Show("O diretório informado não existe.");
                    return;
                }
            }
            try {
                FileSecurity fileSecurity = File.GetAccessControl(txtRecurso.Text);
                IdentityReference identityReference = fileSecurity.GetOwner(typeof(SecurityIdentifier));
                NTAccount ntAccount = identityReference.Translate(typeof(NTAccount)) as NTAccount;
                txtDono.Text = ntAccount.Value.ToString();
            }
            catch(Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message);
            }
   }

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:

FileAttributes attr = File.GetAttributes(txtRecurso.Text);

!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.

FileSecurity fileSecurity = File.GetAccessControl(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 :

 IdentityReference identityReference = fileSecurity.GetOwner(typeof(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.

O valor retornado é um novo objeto IdentityReference que trata o objeto NTAccount.

NTAccount ntAccount = identityReference.Translate(typeof(NTAccount)) as NTAccount;

Depois basta exibir o valor usando a propriedade Value:

txtDono.Text = ntAccount.Value.ToString();

O código VB .NET é mostrado a seguir:

Imports System.IO
Imports System.Security.AccessControl
Imports System.Security.Principal
Public Class Form1
    Private Sub btnObterDono_Click(sender As Object, e As EventArgs) Handles btnObterDono.Click
        Dim attr As FileAttributes = File.GetAttributes(txtRecurso.Text)
        If attr.HasFlag(FileAttributes.Archive) Then
            If Not File.Exists(txtRecurso.Text) Then
                MessageBox.Show("O arquivo informado não existe.")
                Return
            End If
        Else
            If Not Directory.Exists(txtRecurso.Text) Then
                MessageBox.Show("O diretório informado não existe.")
                Return
            End If
        End If
        Try
            Dim fileSecurity As FileSecurity = File.GetAccessControl(txtRecurso.Text)
            Dim identityReference As IdentityReference = fileSecurity.GetOwner(GetType(SecurityIdentifier))
            Dim ntAccount As NTAccount = TryCast(identityReference.Translate(GetType(NTAccount)), NTAccount)
            txtDono.Text = ntAccount.Value.ToString()
        Catch ex As Exception
            MessageBox.Show("Erro : " + ex.Message)
        End Try
    End Sub
End Class

Executando o projeto iremos obter o resultado a seguir usando a pasta c:\Users:

Pegue o projeto completo aqui : Obtendo_Dono_Arquivo.zip

Porque pela graça sois salvos, por meio da fé; e isto não vem de vós, é dom de Deus.
Não vem das obras, para que ninguém se glorie;

Efésios 2:8,9

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti