Acesso ao caminho negado

164

Sei que essa pergunta foi feita várias vezes aqui, mas não consigo encontrar uma solução para o meu problema. Estou tentando salvar a imagem na pasta em .net c #, mas obtém esta exceção:

Access to the path 'C:\inetpub\wwwroot\mysite\images\savehere' is denied.The error occured at mscorlib because    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode)

Dei controle total a essa pasta (savehere) network servicee iis_iusrsaté dei controle total, everyonemas ainda obtendo essa exceção. Eu tentei dar acesso via explorer e via gerenciador do IIS, ainda sem sorte

Estou fazendo isso no servidor Windows 2008 R2 e IIS 7.5. Quem preciso dar acesso?

obrigado

Burjua
fonte
Você já tentou usar um caminho relativo ao seu aplicativo? Não sei muito sobre o servidor Windows, mas pode ser que ele não permita acesso a um caminho raiz `C:`.
Michael K
1
Futuros leitores: verifique as permissões no arquivo.
Ruskin

Respostas:

94

Você precisa descobrir no pool de aplicativos do site qual é a identidade em que ele está executando (por padrão, isso é Application Pool Identity) e conceder as permissões corretas.

Oded
fonte
Ok, obrigado, eu tenho 5 pools, todos eles têm identidade como ApplicationPoolIdentity, como faço para conceder permissões a ele?
Burjua
22
@Burjua - procure o IIS APPPOOL\DefaultAppPoolusuário. Veja este artigo no site oficial IIS: learn.iis.net/page.aspx/624/application-pool-identities
Oded
1
Ok, como está escrito neste artigo eu adicionei DefaultAppPoole deu full controlpermissão para isso, mas ainda obter o mesmo erro
Burjua
2
Eu sei que estou atrasado. Mas estou enfrentando o mesmo problema. O OP mencionou claramente que ele havia dado everyoneo controle total. Se concedermos everyoneo controle Total, mesmo assim, precisamos conceder acesso a DefaultAppPool? É confuso.
qurban
3
@stom - é claro que não é uma prática recomendada. Você está abrindo o site para todos os tipos de vulnerabilidades. Você deseja apenas permissões de leitura / gravação no Imagesdiretório do usuário / identidade que está executando o site (será necessário perguntar ao seu provedor de hospedagem sobre isso).
Oded
223

O acesso ao caminho 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere' foi negado

Leia a mensagem com atenção. Você está tentando salvar em um arquivo que tenha o mesmo nome que o diretório. Isso não funciona, você não pode sobrescrever um diretório preenchido com arquivos com um único novo arquivo. Isso causaria perda de dados não diagnosticável. "O acesso ao caminho é negado" é o sistema de arquivos que está reagindo para impedir que isso aconteça.

A mensagem de exceção não é ideal, mas vem diretamente do sistema operacional e é lançada em pedra. A estrutura geralmente adiciona verificações extras para gerar mensagens melhores, mas esse é um teste caro em uma rede. Perf também é um recurso.

Você precisa usar um nome como 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere \ mumble.jpg'. Considere Path.Combine () para gerar com segurança o nome do caminho.

Hans Passant
fonte
19
@Hans Passant Obrigado pela sua declaração, um pouco dura. Isso me fez olhar para o meu código e perceber que havia cometido o mesmo erro.
LosManos
para mim, o problema era que o arquivo estava existindo e o usuário não podia substituí-lo
#
Hah! Eu fiz exatamente a mesma coisa.
Javajgordon # 9/13
Talvez esse tópico deva estar bloqueado para proteger contra "Eu também!" respostas. Porque eu também! No meu caso, devo acrescentar que estou irritado por o método SaveAs de um objeto HttpPostedFileBase exigir um nome além do caminho, considerando que o nome é outra propriedade do objeto. Claro que acho que você poderia dar um nome diferente dessa maneira.
Ralph
1
Eu recebi esse erro ao tentar gravar um arquivo em um teste de unidade (nada a ver com o IIS ou qualquer coisa relacionada à Web), e a mensagem de erro é muito vaga. Por que não diz algo entre as linhas de "Não é possível abrir \ caminho \ para \ arquivo como um arquivo"?
MarioDS 23/08/16
22

Eu estava tendo o mesmo problema ao tentar criar um arquivo no servidor (na verdade, um arquivo que é uma cópia de um modelo).

Aqui está a mensagem de erro completa:

{ERROR} 08/07/2012 22:15:58 - System.UnauthorizedAccessException: Access to the path 'C:\inetpub\wwwroot\SAvE\Templates\Cover.pdf' is denied.

Adicionei uma nova pasta chamada Templatesdentro da pasta do aplicativo IIS. Uma coisa muito importante no meu caso é que eu precisava conceder a permissão Write (Gravar) para o usuário IUSR nessa pasta. Você também pode precisar de dar Network Servicee ASP.NET v$.#a mesma permissão de gravação.

insira a descrição da imagem aqui

Depois de fazer isso, tudo funciona como esperado.

Leniel Maccaferri
fonte
12

Eu tive exatamente o mesmo problema.

A solução foi que o arquivo que eu estava tentando acessar era somente leitura , pois era copiado de um arquivo de modelo que era somente leitura.

<facepalm />

Ruskin
fonte
A Classe de Aplicativo AltovaXML (DCOM) está fazendo isso. Me causou problemas.
Mike D
Com o que quero dizer, ele deve estar usando algo semelhante à linha a seguir, o que significa que o XSLT não deve ser somente leitura. 'FileStream ms = novo FileStream (caminho, FileMode.Open, FileAccess.ReadWrite);'
Mike D
1
Aqui está um <facepalm /> de mim também. Ah e .. Obrigado, somente leitura também foi meu problema.
Cătălin Rădoi
7

Eu tenho esse problema ao tentar salvar o arquivo sem definir o nome do arquivo.

Código antigo

File.WriteAllBytes(@"E:\Folder", Convert.FromBase64String(Base64String));

Código de trabalho

File.WriteAllBytes(@"E:\Folder\"+ fileName, Convert.FromBase64String(Base64String));
MarceloBarbosa
fonte
6

Meu problema era que eu precisava solicitar apenas acesso de leitura:

FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);
jesal
fonte
1
Bingo - este também me mordeu! Obrigado pelo post!
paulsm4 11/06
4

Qual Identidade é o seu Pool de Aplicativos para o aplicativo Web em execução como, para solucionar problemas, tente criar um novo Pool de Aplicativos com o nome Serviço de Rede como sua identidade e faça com que seu aplicativo Web use o novo Pool de Aplicativos que você criou e veja se o erro persiste.

Ta01
fonte
4

A dica a seguir não é uma resposta para a pergunta original deste tópico, mas pode ajudar outros usuários que acabam nesta página da web, depois de cometer o mesmo erro estúpido que acabei de cometer ...

Eu estava tentando obter um controle ASP.Net FileUpload para carregar o arquivo em um endereço de rede que continha um " compartilhamento oculto ", a saber:

\ MyNetworkServer \ c $ \ SomeDirectoryOrOther

Eu não entendi Se eu executasse a página da Web no modo Debug no Visual Studio, funcionaria bem. Mas quando o projeto foi implantado e estava sendo executado por um usuário do Pool de Aplicativos, ele se recusou a encontrar esse diretório de rede.

Eu verifiquei em qual usuário meu site IIS estava sendo executado, dei a esse usuário permissões completas para este diretório no servidor " MyNetworkServer ", etc etc, mas nada funcionou.

O motivo (claro!) É que apenas os administradores podem "ver" esses compartilhamentos de unidades ocultas.

Minha solução foi simplesmente criar um compartilhamento "normal" para

\ MyNetworkServer \ SomeDirectoryOrOther

e isso se livrou do erro "Acesso ao caminho ... é negado". O FileUpload conseguiu executar com êxito o comando

fileUpload.SaveAs(networkFilename);

Espero que isso ajude outros usuários que cometem o mesmo erro que eu cometi!

Observe também que, se você estiver carregando arquivos grandes (acima de 4Mb), o IIS7 exigirá que você modifique o arquivo web.config em dois locais. Clique neste link para ler o que você precisa fazer: Carregar arquivos grandes no ASP.Net

Mike Gledhill
fonte
4

adicione a permissão de controle total IIS_IUSERS à sua pasta. você encontra essa opção na guia segurança nas propriedades da pasta. encontre esta opção e o usuário nesta imagem

Ali Rasouli
fonte
Mau conselho. Dar arbitrariamente ao IIS_USERS "controle total" - sem consideração cuidadosa - é o equivalente moral de dizer "Enfermeira - serra elétrica";)
paulsm4 11/11
4

Eu resolvi com esta configuração:

IIS> Pools de aplicativos> [seu site]> Configurações avançadas ...> Identidade> Acesso interno> LocalSystem

Mohammad Hossein Ganjyar
fonte
2
Isso concede permissões ao LocalAdmin do site. Esta é uma preocupação de segurança.
Rich-Lang
1
NUNCA gere seu site na conta LocalSystem. SEMPRE. PERÍODO.
Mihail Shishkov
@MihailShishkov por quê?
Mohammad Hossein Ganjyar 08/07/19
2
@MohammadHosseinGanjyar LocalSystem possui direitos de administrador sobre o sistema. Ao executar o site nessa conta, você basicamente fornece as chaves para todo o sistema e, provavelmente, para toda a rede local na qual o servidor reside. Isso significa que, se um invasor encontrar uma maneira de explorar seu site - o site e todo o sistema estarão ferrados. Essa é a razão pela qual privilégios / direitos e contas existem em primeiro lugar. Como regra geral, lembre-se disso - nenhum software deve ser executado com maiores privilégios do que o necessário. Por exemplo, o site do blog não precisa do direito de formatar a unidade D:
Mihail Shishkov
2

Meu problema era algo assim:

FileStream ms = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);

mas ao invés de usar o path eu deveria usar File.FullName ... não sei se vai ajudar mais alguém, apenas passando minha própria experiência com esse erro dado!

Tarcísio Luna
fonte
2
  1. Altere a configuração de conta interna para conta personalizada e insira o nome de usuário e a senha do outro servidor.

  2. Mantenha a configuração como integrada (em vez do modo clássico).

uday
fonte
1

Talvez isso ajude você.

string tempDirectoryPath = @"C:\Users\HOPE\Desktop\Test Folder";
string zipFilePath = @"C:\Users\HOPE\Desktop\7za920.zip";
Directory.CreateDirectory(tempDirectoryPath);
ZipFile.ExtractToDirectory(zipFilePath, tempDirectoryPath);
umutcakar
fonte
0

Faça com que o Diretório seja salvo como diretório virtual e dê permissão de leitura / gravação no painel de controle

Harsh Baid
fonte
Execute o InetMgr.exe e vá para a sua pasta savehere em mysite (aplicativo da Web / site no IIS); ele estará no lado esquerdo onde o DefaultApp está localizado, espero que tenha
entendido
0

Tinha um diretório com o mesmo nome que o arquivo que eu estava tentando escrever, para que as pessoas possam procurar por isso também.

Samuel
fonte
0

Encontrei esse problema ao desenvolver na minha estação de trabalho local.

Após várias iisresetinvocações malsucedidas , resolvi essa situação reiniciando minha máquina.

Em retrospecto, um identificador de arquivo aberto pode estar causando problemas.

Jim G.
fonte
0

No meu caso, tive que adicionar uma regra de autorização do .NET para o site no IIS.

Eu adicionei uma regra para permitir usuários anônimos.

Regras de autorização do .NET

GerardBeckerleg
fonte
0

Eu tive o mesmo problema, mas o corrigi salvando o arquivo em um local diferente, copiando o arquivo e colando-o no local em que queria que ele estivesse. Usei a opção para substituir o arquivo existente e isso fez o truque para mim. Sei que essa não é a maneira mais eficiente, mas funciona e leva menos de 15 segundos.

Samuel Nde
fonte
0

Eu tive muitos problemas com isso, especificamente relacionados ao meu código em execução localmente, mas quando eu precisava executá-lo no IIS, estava lançando esse erro. Descobri que adicionar uma verificação ao meu código e permitir que o aplicativo criasse a pasta na primeira execução corrigia o problema sem ter que mexer nas autorizações das pastas.

algo assim antes de chamar seu método que usa a pasta

bool exists = System.IO.Directory.Exists("mypath");

        if (!exists)
            System.IO.Directory.CreateDirectory("mypath");
AtLeastTheresToast
fonte
0

Se você receber esse erro ao fazer upload de arquivos no Subdomínio E funcionar corretamente no seu localhost, siga as etapas abaixo:

Solução:

Painel Plesk

  • Entre no seu painel Plesk. Selecione Seu subdomínio que está dando erro.
  • Clique em Configurações de hospedagem .
  • Selecione Permissões adicionais de gravação / modificação e Aplicar.

CPanel

  • Não tenho certeza sobre as opções disponíveis no CPanel. Mas, se você der permissão para o diretório (no CPanel, ele deve ser o número decimal como 777, 755), o erro será resolvido.

Para mais detalhes consulte aqui

Motivo do erro:

  • Vamos assumir FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*))que será o seu código para mover seus arquivos para o caminho de upload.
  • Server.MapPathfornecerá o caminho físico (Real Path) do diretório. Mas seu subdomínio pode não ter permissão para acessar o caminho físico.

  • Portanto, se você der permissão ao subdomínio para acessar a permissão de gravação / modificação, ele resolverá o problema.

Guruprasad Bhat
fonte
0

Você pode tentar verificar se as propriedades da web do projeto não mudaram para o IIS Express e alterá-las novamente para o IIS Local

AMykowski
fonte
0

Verifique se o seu destino System.IO.Delete(string file)é um arquivo que existe. Talvez haja um erro no seu código; como se você não passasse o nome do arquivo correto para o método, ou se o seu destino é uma pasta. Nesses casos, você verá o erro "acesso negado ao caminho".

Mohammad Yoosefiyan
fonte
-1

Eu criei um diretório virtual com permissão total e adicionei a fonte ffmpeg e os arquivos de vídeo lá, então finalmente fez sentido, pois pode ser acessado por qualquer pessoa.

Kamila
fonte