Preciso testar se um usuário pode gravar em uma pasta antes de realmente tentar fazer isso.
Eu implementei o método a seguir (no C # 2.0) que tenta recuperar as permissões de segurança da pasta usando o método Directory.GetAccessControl () .
private bool hasWriteAccessToFolder(string folderPath)
{
try
{
// Attempt to get a list of security permissions from the folder.
// This will raise an exception if the path is read only or do not have access to view the permissions.
System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath);
return true;
}
catch (UnauthorizedAccessException)
{
return false;
}
}
Quando eu estava pesquisando no Google como testar o acesso de gravação, nada disso apareceu e parecia muito complicado testar as permissões no Windows. Preocupo-me por simplificar demais as coisas e por esse método não ser robusto, embora pareça funcionar.
Meu método para testar se o usuário atual tem acesso de gravação funcionará corretamente?
c#
permissions
directory
Chris B
fonte
fonte
Respostas:
Essa é uma maneira perfeitamente válida de verificar o acesso à pasta em C #. O único lugar em que ela pode cair é se você precisar chamar isso em um loop apertado, onde a sobrecarga de uma exceção pode ser um problema.
Houve outras perguntas semelhantes feitas anteriormente.
fonte
Compreendo que este seja um pouco tarde para este post, mas você pode achar útil esse código.
Coloque isso em um aplicativo de console e veja se ele faz o que você precisa.
fonte
GetAccessControl
mas meu software é realmente capaz de gravar no diretório que estou procurando ..?fonte
string tempFileName = Path.GetRandomFileName();
evidentemente #Eu tentei a maioria delas, mas elas fornecem falsos positivos, pelo mesmo motivo. Não é suficiente testar o diretório para obter uma permissão disponível; você deve verificar se o usuário conectado é membro de um grupo que possui esse tipo de permissão. permissão. Para fazer isso, obtenha a identidade dos usuários e verifique se é membro de um grupo que contém o FileSystemAccessRule IdentityReference. Eu testei isso, funciona perfeitamente ..
fonte
(AccessRight & rule.FileSystemRights) > 0
fato de que qualquer tipo de sub-acesso negado faz parte de umAccessRight
meio que você não possui completo acesso aAccessRight
IMHO, a única maneira 100% confiável de testar se você pode gravar em um diretório é realmente gravá-lo e, eventualmente, capturar exceções.
fonte
Por exemplo, para todos os usuários (Builtin \ Users), esse método funciona bem.
fonte
Tente o seguinte:
fonte
fsAccessRule.AccessControlType
poderia estarAccessControlType.Deny
.Seu código obtém o
DirectorySecurity
para um determinado diretório e manipula uma exceção (devido ao fato de você não ter acesso às informações de segurança) corretamente. No entanto, na sua amostra, você realmente não interroga o objeto retornado para ver qual acesso é permitido - e acho que você precisa adicionar isso.fonte
Aqui está uma versão modificada da resposta do CsabaS , que explica regras explícitas de acesso negado. A função passa por todos os FileSystemAccessRules para um diretório e verifica se o usuário atual está em uma função que tem acesso a um diretório. Se nenhuma dessas funções for encontrada ou o usuário estiver em uma função com acesso negado, a função retornará false. Para verificar os direitos de leitura, passe FileSystemRights.Read para a função; para direitos de gravação, passe FileSystemRights.Write. Se você deseja verificar os direitos de um usuário arbitrário e não o atual, substitua o currentUser WindowsIdentity pelo WindowsIdentity desejado. Eu também desaconselho confiar em funções como esta para determinar se o usuário pode usar o diretório com segurança. Esta resposta explica perfeitamente o porquê.
fonte
As soluções acima são boas, mas para mim, acho esse código simples e viável. Basta criar um arquivo temporário. Se o arquivo for criado, seu usuário médio terá acesso de gravação.
fonte
Create
permissão, mas nãoDelete
no caso em que isso iria retornar false mesmo que o usuário não tem permissão de escrita.Path.Combine
vez disso comoPath.Combine(tempfilepath, "temp.txt")
.Você pode tentar seguir o bloco de código para verificar se o diretório está tendo acesso de gravação. Ele verifica o FileSystemAccessRule.
fonte
Você tem uma condição de corrida em potencial no seu código - o que acontece se o usuário tiver permissões para gravar na pasta quando você marcar, mas antes que o usuário realmente grave na pasta, essa permissão será retirada? A gravação lançará uma exceção que você precisará capturar e manipular. Portanto, a verificação inicial é inútil. Você também pode escrever e manipular qualquer exceção. Este é o padrão padrão para sua situação.
fonte
http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
Classe muito útil, verifique a versão melhorada nas mensagens abaixo.
fonte
Simplesmente tentar acessar o arquivo em questão não é necessariamente suficiente. O teste será executado com as permissões do usuário que está executando o programa - que não são necessariamente as permissões de usuário com as quais você deseja testar.
fonte
Eu concordo com Ash, isso deve ficar bem. Como alternativa, você pode usar o CAS declarativo e impedir a execução do programa em primeiro lugar, se eles não tiverem acesso.
Acredito que alguns dos recursos do CAS podem não estar presentes no C # 4.0 pelo que ouvi, não tenho certeza se isso pode ser um problema ou não.
fonte
Não consegui obter GetAccessControl () para lançar uma exceção no Windows 7, conforme recomendado na resposta aceita.
Acabei usando uma variação da resposta do sdds :
Espero que isto ajude.
fonte
Eu enfrentei o mesmo problema: como verificar se consigo ler / gravar em um diretório específico. Acabei com a solução fácil para ... realmente testá-lo. Aqui está minha solução simples, porém eficaz.
Espero que ajude !
fonte
A maioria das respostas aqui não verifica o acesso de gravação. Apenas verifique se o usuário / grupo pode 'Ler Permissão' (Leia a lista ACE do arquivo / diretório).
Também itera através do ACE e verifica se ele corresponde ao Identificador de Segurança não funciona porque o usuário pode ser membro de um grupo do qual ele pode obter / perder privilégios. Pior que isso é grupos aninhados.
Eu sei que este é um tópico antigo, mas existe uma maneira melhor para quem procura agora.
Desde que o usuário tenha o privilégio de permissão de leitura, é possível usar a API Authz para verificar o acesso efetivo.
https://docs.microsoft.com/en-us/windows/win32/secauthz/using-authz-api
https://docs.microsoft.com/en-us/windows/win32/secauthz/checking-access-with-authz-api
fonte