L'accès au chemin est refusé

165

Je sais que cette question a été posée plusieurs fois ici, mais je ne trouve pas de solution à mon problème. J'essaye d'enregistrer l'image dans le dossier dans .net c # mais obtenez cette exception:

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)

J'ai donné le contrôle total de ce dossier (savehere) à network serviceet iis_iusrs, j'ai même donné un contrôle total sur everyonemais toujours cette exception. J'ai essayé de donner accès via l'explorateur et via le gestionnaire IIS, toujours pas de chance

Je le fais sur le serveur Windows 2008 R2 et IIS 7.5, de qui ai-je besoin pour donner accès?

Merci

Burjua
la source
Avez-vous essayé d'utiliser un chemin relatif à votre application? Je ne sais pas grand-chose sur le serveur Windows, mais il se peut qu'il ne permette pas d'accéder à un chemin racine `C:`
Michael K
1
Futurs lecteurs: vérifiez les autorisations sur le fichier.
Ruskin

Réponses:

94

Vous devez trouver dans le pool d'applications du site Web quelle est l'identité sous laquelle il s'exécute (par défaut, il s'agit Application Pool Identity) et lui accorder les autorisations appropriées.

Oded
la source
Ok, merci, j'ai 5 pools, ils ont tous une identité ApplicationPoolIdentity, comment puis-je leur donner des autorisations?
Burjua
22
@Burjua - recherchez l' IIS APPPOOL\DefaultAppPoolutilisateur. Voir cet article sur le site officiel d'IIS: learn.iis.net/page.aspx/624/application-pool-identities
Oded le
1
Ok, comme écrit dans cet article, je l'ai ajouté DefaultAppPoolet lui ai donné les full controlautorisations, mais
j'obtiens
2
Je sais que je suis trop tard. Mais je suis confronté au même problème. Le PO avait clairement mentionné qu'il avait donné everyonele contrôle total. Si nous accordons everyonele contrôle total, même alors nous devons accorder l'accès à DefaultAppPool? C'est confu.
qurban
3
@stom - bien sûr, ce n'est pas la meilleure pratique. Vous ouvrez le site Web à toutes sortes de vulnérabilités. Vous voulez simplement des autorisations de lecture / écriture sur le Imagesrépertoire pour l'utilisateur / l'identité qui exécute le site Web (vous devrez demander à votre fournisseur d'hôte à ce sujet).
Oded
223

L'accès au chemin 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere' est refusé

Lisez attentivement le message. Vous essayez d'enregistrer dans un fichier portant le même nom que le répertoire. Cela ne peut pas fonctionner, vous ne pouvez pas écraser un répertoire rempli de fichiers avec un seul nouveau fichier. Cela entraînerait une perte de données non diagnostiquée. «L'accès au chemin est refusé» est le système de fichiers qui riposte pour empêcher que cela ne se produise.

Le message d'exception n'est pas idéal, mais il vient directement du système d'exploitation et ils sont gravés dans la pierre. Le framework ajoute souvent des contrôles supplémentaires pour générer de meilleurs messages, mais il s'agit d'un test coûteux sur un réseau. Perf est également une fonctionnalité.

Vous devez utiliser un nom comme 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere \ mumble.jpg'. Considérez Path.Combine () pour générer de manière fiable le nom du chemin.

Hans Passant
la source
19
@Hans Passant Merci pour votre déclaration un peu sévère. Cela m'a fait examiner mon code et me rendre compte que j'avais commis la même erreur.
LosManos
pour moi, le problème était que le fichier existait et que l'utilisateur ne pouvait pas le remplacer
VinnyG
Hah! J'ai fait exactement la même chose.
jakejgordon
Peut-être que ce fil devrait être verrouillé pour se protéger contre "Moi aussi!" réponses. Parce que moi aussi! Dans mon cas, je dois ajouter que je suis ennuyé que la méthode SaveAs d'un objet HttpPostedFileBase nécessite un nom en plus du chemin, étant donné que le nom est une autre propriété de l'objet. Bien sûr, je suppose que vous pourriez lui donner un nom différent de cette façon.
Ralph
1
J'ai eu cette erreur en essayant d'écrire un fichier dans un test unitaire (rien à voir avec IIS ou quoi que ce soit lié au Web), et le message d'erreur est si vague. Pourquoi ne dit-il pas quelque chose parmi les lignes de "Impossible d'ouvrir \ chemin \ vers \ fichier en tant que fichier"?
MarioDS
22

J'avais le même problème en essayant de créer un fichier sur le serveur (en fait un fichier qui est une copie d'un modèle).

Voici le message d'erreur complet:

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

J'ai ajouté un nouveau dossier appelé Templatesdans le dossier de l'application IIS. Une chose très importante dans mon cas est que je devais donner l'autorisation d'écriture (Gravar) à l'utilisateur IUSR sur ce dossier. Vous devrez peut - être donner Network Serviceet ASP.NET v$.#la même autorisation d'écriture.

entrez la description de l'image ici

Après avoir fait cela, tout fonctionne comme prévu.

Leniel Maccaferri
la source
12

J'ai eu exactement le même problème.

La solution était que le fichier auquel j'essayais d'accéder était en lecture seule , car il était copié à partir d'un fichier modèle en lecture seule.

<facepalm />

Ruskin
la source
La classe d'application Altova AltovaXML (DCOM) le fait. Cela m'a causé des problèmes.
Mike D
Je veux dire par là qu'il doit utiliser quelque chose de similaire à la ligne suivante, ce qui signifie que XSLT ne doit pas être en lecture seule. 'FileStream ms = new FileStream (chemin, FileMode.Open, FileAccess.ReadWrite);'
Mike D
1
Voici également un <facepalm /> de ma part. Oh et ... Merci, la lecture seule était aussi mon problème.
Cătălin Rădoi
7

J'ai eu ce problème lorsque j'essaie d'enregistrer le fichier sans définir le nom du fichier.

Ancien code

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

Code de travail

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

Mon problème était que je devais demander un accès en lecture uniquement:

FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);
jesal
la source
1
Bingo - celui-ci m'a mordu aussi! Merci pour le message!
paulsm4
4

Quelle est l'identité de votre pool d'applications pour l'application Web exécutée en tant que, pour résoudre les problèmes, essayez de créer un nouveau pool d'applications avec, par exemple, le service réseau comme identité et faites en sorte que votre application Web utilise ce nouveau pool d'applications que vous avez créé et voyez si l'erreur persiste.

Ta01
la source
4

L'astuce suivante n'est pas une réponse à la question originale de ce fil, mais pourrait aider d'autres utilisateurs qui se retrouvent sur cette page Web, après avoir commis la même erreur stupide que je viens de faire ...

J'essayais d'obtenir un contrôle ASP.Net FileUpload pour télécharger son fichier vers une adresse réseau contenant un " partage caché ", à savoir:

\ MyNetworkServer \ c $ \ SomeDirectoryOrOther

Je n'ai pas compris. Si j'exécutais la page Web en mode débogage dans Visual Studio, cela fonctionnerait bien. Mais lorsque le projet a été déployé et s'exécutait via un utilisateur du pool d'applications, il a refusé de trouver ce répertoire réseau.

J'avais vérifié sous quel utilisateur mon site IIS fonctionnait, j'ai donné à cet utilisateur des autorisations complètes sur ce répertoire sur le serveur " MyNetworkServer ", etc., mais rien n'a fonctionné.

La raison (bien sûr!) Est que seuls les administrateurs peuvent "voir" ces partages de lecteurs cachés.

Ma solution consistait simplement à créer un partage "normal" sur

\ MyNetworkServer \ SomeDirectoryOrOther

et cela a éliminé l'erreur "L'accès au chemin ... est refusé". FileUpload a réussi à exécuter la commande

fileUpload.SaveAs(networkFilename);

J'espère que cela aidera d'autres utilisateurs qui font la même erreur que moi!

Notez également que si vous téléchargez des fichiers volumineux (plus de 4 Mo), IIS7 nécessite que vous modifiiez le fichier web.config à deux endroits. Cliquez sur ce lien pour lire ce que vous devez faire: Télécharger de gros fichiers dans ASP.Net

Mike Gledhill
la source
4

veuillez ajouter l'autorisation de contrôle total IIS_IUSERS à votre dossier. vous trouvez cette option dans l'onglet de sécurité dans les propriétés du dossier. trouver cette option et l'utilisateur dans cette image

Ali Rasouli
la source
Mauvais conseil. Donner arbitrairement à IIS_USERS un "contrôle total" - sans mûre considération - est l'équivalent moral de dire "Infirmière - tronçonneuse";)
paulsm4
4

J'ai résolu avec ce paramètre:

IIS> Pools d'applications> [votre site]> Paramètres avancés ...> Identité> Compte intégré> LocalSystem

Mohammad Hossein Ganjyar
la source
2
Cela donne à votre site Web les autorisations LocalAdmin. C'est un problème de sécurité.
Rich-Lang
1
NE JAMAIS exécuter votre site Web sous un compte LocalSystem. DÉJÀ. PÉRIODE.
Mihail Shishkov
@MihailShishkov pourquoi?
Mohammad Hossein Ganjyar
2
@MohammadHosseinGanjyar LocalSystem a des droits d'administrateur sur le système. En exécutant le site Web sous ce compte, vous lui donnez essentiellement les clés de l'ensemble du système et probablement de l'ensemble du réseau local sur lequel réside le serveur. Cela signifie que si un attaquant trouve un moyen d'exploiter votre site Web, le site Web et l'ensemble du système sont vissés. C'est la raison pour laquelle les privilèges / droits et les comptes existent en premier lieu. En règle générale, rappelez-vous ceci: aucun logiciel ne doit fonctionner avec des privilèges plus importants que ceux dont il a besoin pour faire son travail. Par exemple, le site de blog n'a pas besoin du droit de formater D: lecteur
Mihail Shishkov
2

Mon problème était quelque chose comme ça:

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

mais au lieu d'utiliser le chemin, je devrais utiliser File.FullName ... Je ne sais pas si cela va aider quelqu'un d'autre, juste en passant ma propre expérience avec cet erro donné!

Tarcísio Luna
la source
2
  1. Modifiez le paramètre de compte intégré en compte personnalisé et entrez le nom d'utilisateur et le mot de passe de l'autre serveur.

  2. Conservez le paramètre intégré (au lieu du mode classique).

uday
la source
1

Peut-être que ça t'aidera.

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

Faire enregistrer le répertoire ici pour être un répertoire virtuel et donner l'autorisation de lecture / écriture à partir du panneau de commande

Harsh Baid
la source
Exécutez InetMgr.exe puis allez dans votre dossier savehere sous mysite (application Web / site Web dans IIS), il sera sur le côté gauche où se trouve DefaultApp, j'espère que vous me le
dites
0

Avait un répertoire du même nom que le fichier que j'essayais d'écrire, donc les gens peuvent aussi le rechercher.

Samuel
la source
0

J'ai rencontré ce problème lors du développement sur mon poste de travail local.

Après plusieurs iisresetinvocations infructueuses , j'ai remédié à cette situation en redémarrant ma machine.

Rétrospectivement, un descripteur de fichier ouvert peut avoir causé des problèmes.

Jim G.
la source
0

Dans mon cas, j'ai dû ajouter une règle d'autorisation .NET pour le site Web dans IIS.

J'ai ajouté une règle pour autoriser les utilisateurs anonymes.

Règles d'autorisation .NET

GerardBeckerleg
la source
0

J'ai eu le même problème mais je l'ai résolu en enregistrant le fichier dans un emplacement différent, puis en copiant le fichier et en le collant à l'emplacement où je le voulais. J'ai utilisé l'option pour remplacer le fichier existant et cela a fait l'affaire pour moi. Je sais que ce n'est pas le moyen le plus efficace, mais cela fonctionne et prend moins de 15 secondes.

Samuel Nde
la source
0

J'ai eu beaucoup de problèmes avec cela, spécifiquement liés à mon code exécuté localement, mais lorsque je devais l'exécuter sur IIS, cela provoquait cette erreur. J'ai trouvé que l'ajout d'une vérification à mon code et le fait de laisser l'application créer le dossier lors de la première exécution résolvaient le problème sans avoir à modifier les autorisations des dossiers.

quelque chose comme ça avant d'appeler votre méthode qui utilise le dossier

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

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

Si vous obtenez cette erreur lors du téléchargement de fichiers dans le sous-domaine et que vous travaillez correctement dans votre localhost, suivez les étapes ci-dessous:

Solution:

Panneau Plesk

  • Connectez-vous à votre panneau Plesk. Sélectionnez votre sous-domaine qui génère une erreur.
  • Cliquer sur Paramètres d'hébergement .
  • Sélectionner Autorisations d'écriture / modification supplémentaires et Appliquer.

CPanel

  • Je ne suis pas sûr des options disponibles dans CPanel. Mais si vous donnez la permission au répertoire (dans CPanel, il doit s'agir d'un nombre décimal comme 777, 755) résoudra l'erreur.

Pour plus de détails, reportez-vous ici

Raison de l'erreur:

  • Assumons FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*)) ce soit votre code pour déplacer vos fichiers vers le chemin de téléchargement.
  • Server.MapPathvous donnera le chemin physique (chemin réel) du répertoire. Mais votre sous-domaine peut ne pas avoir l'autorisation d'accéder au chemin physique.

  • Donc, si vous donnez l'autorisation au sous-domaine d'accéder à l'autorisation d'écriture / de modification, cela résoudra le problème.

Guruprasad Bhat
la source
0

Vous pouvez essayer de vérifier si vos propriétés Web pour le projet n'ont pas basculé vers IIS Express et les redéfinir sur IIS Local

AMykowski
la source
0

Assurez-vous que votre cible dans System.IO.Delete(string file)est un fichier qui existe. Peut-être qu'il y a une erreur dans votre code; comme si vous ne transmettez pas le nom de fichier correct à la méthode ou que votre cible est un dossier. Dans ces cas, vous verrez le message: "l'erreur d'accès au chemin est refusée".

Mohammad Yoosefiyan
la source
-1

J'ai créé un répertoire virtuel avec l'autorisation complète et y ai ajouté la source ffmpeg et les fichiers vidéo, donc finalement cela a du sens car il peut être accessible par n'importe qui.

Kamila
la source