Como faço para programaticamente controlo eficaz excluir (modificar) ou permissões de gravação em .NET?

StackOverflow https://stackoverflow.com/questions/369273

  •  21-08-2019
  •  | 
  •  

Pergunta

Desculpe antecipadamente para a pergunta longa. O que eu estou realmente interessado em é uma maneira de verificar programaticamente se a identidade janelas de execução tem privilégios janelas adequadas para escrever para um diretório (ou arquivo) em um aplicativo de serviços da Web ASP.NET. Mas eu vou resolver para recuperar eficazes Eliminar (modificar) os privilégios de um usuário para um determinado diretório ou arquivo. O problema é que eu gostaria de ser capaz de fazer isso sem qualquer gravação de arquivos temporários ou necessariamente executando a ação IO e manipulação de exceção.

Sim, há uma pergunta sobre este já (ver Como posso programaticamente determinar se eu tiver privilégios de gravação usando C # no .net? ) Normalmente eu concordaria com a resposta aceita que o melhor método é apenas para tentar a ação IO e lidar com quaisquer excepções - métodos System.IO fazer System.UnauthorizedAccessException lance para indicar falha como resultado da negação privilégio. Mas no caso de de arquivos de upload, eu realmente gostaria de verificar os privilégios antes de desperdiçar o tempo e os recursos de transferência de dados, uma vez que é só depois de fazer upload de que podemos tentar gravar o arquivo ou pasta em questão. Tenho pena de todos os usuários upload de um arquivo de 2 GB através de HTTP apenas para ser informado depois da conclusão do carregamento que eles não têm permissão para fazer o upload do arquivo para o destino.

A abordagem usual para testar o acesso de escrita se você não quiser executar a gravação real é escrever um arquivo temporário. A outra pergunta tem uma resposta apontar isto. Isto é o que o nosso código faz atualmente. Mas a segurança do Windows permite acesso de gravação sem privilégios de exclusão. Os usuários com acesso somente gravação mas não tem fim exclusão deixando todos os tipos de arquivos .tmp não excluídos. E não, não queremos usar uma conta de administrador de domínio para redefinir o ACL nos arquivos tmp e, em seguida, excluí-los. A abordagem que eu tenho que tomar é verificar se o usuário tem privilégios de gravação usando System.IO.Directory.GetAccessControl (..) ou System.IO.File.GetAccessControl (..) e lidar com as várias regras de acesso e retornos ECA ... mas com isso eu ainda tenho questões relacionadas com privilégios eficaz - isto é, na maioria dos casos eu também tenho que olhar para cima a associação do usuário em qualquer um dos grupos listados na ACE que têm permissões no objeto. Tem que haver uma maneira mais fácil .... não há?

Foi útil?

Solução

elogios bem para ir a milha extra na experiência do usuário e tentar manter a estrutura do programa de limpeza. Talvez se você estiver fazendo o upload somente você poderia tentar criar um arquivo vazio 'espaço reservado' com o mesmo nome que o arquivo final 2GB terá, em seguida, basta substituí-lo. Não é perfeito, pois você ainda pode acabar com um arquivo vazio, mas muito fácil e, pelo menos, um pouco mais elegante que algumas das alternativas.

Outras dicas

Você também pode ter arquivo permanente, dizer 'access_test.txt', que você tenta substituir com um datestamp ou algo para primeiro a testar o acesso actual.

@ Paulo, eu realmente gosto de suas respostas, e eu acho que em aplicações web normais, onde há um conjunto conhecido e relativamente pequeno de potenciais diretórios de destino upload, você tem a solução adequada: 1 - Se o aplicativo pode ter usuários que não têm privieleges acrescentar dados, todos os diretórios de upload deve ter um arquivo de teste conhecido que as operações Anexar são testados contra a verificar antes de fazer o upload
. 2 - Se não há nenhuma preocupação sobre privilégios acrescentar dados, o aplicativo pode simplesmente escrever uma versão vazia do arquivo e anexar a ele em upload. Estou aceitando a sua resposta para ter certeza de obter crédito por isso.

Infelizmente, na minha candidatura não temos um finito ou conjunto conhecido de diretórios de destino de upload - qualquer ação ou pasta na rede pode ser acessível. O que vamos implementar é tamponamento dos dados de upload em relativamente pequenos pedaços e abra o arquivo de destino no modo anexar Mas espere um FileStream aberto para a duração do upload (sim, existem preocupações para lidar FileStreams que são esta longa duração) Este dá uma exceção rápido (acontece assim que o primeiro bloco é escrito para o FileStream) se não há privilégios de gravação w / o ser dependente de privilégios acrescentar dados. Mas eu não recomendo este design para qualquer um - se você pode obter afastado com ele experimente um dos @ soluções sugeridas de Paulo. E se você não tem que se preocupar com mensagens precoce de falta de privilégios de gravação no upload, apenas lidar com as exceções e não se preocupe com isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top