Dicas sobre desenvolvimento de software, gestão e tributações

Rede Social

25 de setembro de 2015

Verificar permissão de escrita em pasta C#


Certo dia me deparei com a seguinte questão, precisava que meu aplicativo gravasse um arquivo em uma pasta que estava na rede,
mas o usuário logado não tinha permissão de escrita nela, somente de leitura, então o método de gravar arquivo retornava um erro
genérico e não conseguia saber ao certo qual era o problema. Quando fui no servidor conferir vi que aquele usuário daquela máquina
não tinha permissão, então com este método que vou lhes mostrar fica fácil saber que o usuário não tem permissão e é possível
mostrar mais detalhadamente isso ao usuário do aplicativo.

public bool PermissaoEscrita(string diretorio)
{
try
{
System.Security.AccessControl.FileSystemSecurity security;

if (File.Exists(diretorio))
{
security = File.GetAccessControl(diretorio);
}
else
{
security = Directory.GetAccessControl(diretorio);
}

var regras = security.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));

var usuarioCorrente = new System.Security.Principal.WindowsPrincipal(System.Security.Principal.WindowsIdentity.GetCurrent());
bool resultado = false;

foreach (System.Security.AccessControl.FileSystemAccessRule regra in regras)
{
if (0 == (regra.FileSystemRights &
(System.Security.AccessControl.FileSystemRights.WriteData | System.Security.AccessControl.FileSystemRights.Write)))
{ continue; }

if (regra.IdentityReference.Value.StartsWith("S-1-"))
{
var sid = new System.Security.Principal.SecurityIdentifier(regra.IdentityReference.Value);

if (!usuarioCorrente.IsInRole(sid))
{ continue; }
}
else
{
if (!usuarioCorrente.IsInRole(regra.IdentityReference.Value))
{ continue; }
}

if (regra.AccessControlType == System.Security.AccessControl.AccessControlType.Deny)
{ return false; }
if (regra.AccessControlType == System.Security.AccessControl.AccessControlType.Allow)
{ resultado = true; }
}

return resultado;
}
catch
{
return false;
}
}

Este método recebe como parâmetro uma string com o caminho do diretorio, verifica se o usuário atual tem permissão de escrita nela e retorna verdadeiro ou falso.
A partir disso pode ser exibida uma mensagem personalizada ao usuário, ou então uma tomada de decisão no código, enfim são várias as possibilidades.

3 comentários:

  1. Funcionou que é uma beleza amigo, muito obrigado mesmo!

    ResponderExcluir
  2. Olá, Henrique. Seu artigo veio de encontro a uma necessidade minha neste momento. Eu entendi o conceito, mas, gostaria de alguns esclarecimentos. O método utilizado por você no exemplo verificar permissões também em arquivos, correto? Ou somente nas pasta mesmo? Esta parte é que fiquei em dúvida. Eu preciso checar se o usuário tem permissão para criar, apagar, escrever e reescrever arquivos no diretório. Ou seja, permissão total na pasta. Tenho que fazer o foreach mesmo?
    Desde já agradeção a atenção!

    ResponderExcluir
    Respostas
    1. Olá, primeiramente agradeço o contato. Bom quando criei esse método estava pensando em escrita em pasta mesmo, não cheguei a testar de alguma outra forma e quanto ao foreach eu utilizei para poder percorrer todas as regras retornadas mais facilmente já que "var regras" contém várias

      Excluir