Der Zugriff auf den Pfad wird verweigert

164

Ich weiß, dass diese Frage hier oft gestellt wurde, aber ich kann keine Lösung für mein Problem finden. Ich versuche, das Bild in dem Ordner in .net c # zu speichern, erhalte jedoch die folgende Ausnahme:

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)

Ich gab diesem Ordner (savehere) die volle Kontrolle network serviceund iis_iusrsgab sogar die volle Kontrolle, bekam everyoneaber immer noch diese Ausnahme. Ich habe versucht, über den Explorer und den IIS-Manager Zugriff zu gewähren, aber immer noch kein Glück

Ich mache es auf Windows Server 2008 R2 und IIS 7.5. Wen brauche ich, um Zugriff zu gewähren?

Vielen Dank

Burjua
quelle
Haben Sie versucht, einen Pfad relativ zu Ihrer Anwendung zu verwenden? Ich weiß nicht viel über Windows Server, aber es kann sein, dass es keinen Zugriff auf einen C: -Stammpfad erlaubt.
Michael K
1
Zukünftige Leser: Überprüfen Sie die Berechtigungen für die Datei.
Ruskin

Antworten:

94

Sie müssen aus dem Anwendungspool für die Website herausfinden, unter welcher Identität sie ausgeführt wird (standardmäßig ist dies Application Pool Identity) und die richtigen Berechtigungen erteilen.

Oded
quelle
Ok, danke, ich habe 5 Pools, alle haben Identität als ApplicationPoolIdentity, wie gebe ich Berechtigungen dafür?
Burjua
22
@ Burjua - suche den IIS APPPOOL\DefaultAppPoolBenutzer. Siehe diesen Artikel auf der offiziellen IIS-Website: learn.iis.net/page.aspx/624/application-pool-identities
Oded
1
Ok, wie in diesem Artikel geschrieben, habe ich hinzugefügt DefaultAppPoolund full controlBerechtigungen erteilt, aber immer noch den gleichen Fehler erhalten
Burjua
2
Ich weiß, dass ich zu spät bin. Aber ich stehe vor dem gleichen Problem. Das OP hatte klar erwähnt, dass er everyonedie volle Kontrolle gegeben hatte. Wenn wir everyonedie volle Kontrolle gewähren , müssen wir auch dann Zugriff gewähren auf DefaultAppPool? Es ist verwirrend.
Qurban
3
@stom - natürlich ist es keine bewährte Methode. Sie öffnen die Website für alle Arten von Sicherheitslücken. Sie möchten nur Lese- / Schreibberechtigungen für das ImagesVerzeichnis / die Identität des Benutzers / der Identität, auf dem / der die Website ausgeführt wird (Sie müssen Ihren Host-Anbieter danach fragen).
Oded
223

Der Zugriff auf den Pfad 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere' wird verweigert

Lesen Sie die Nachricht sorgfältig durch. Sie versuchen, in einer Datei zu speichern, die denselben Namen wie das Verzeichnis hat. Das kann nicht funktionieren, Sie können ein mit Dateien gefülltes Verzeichnis nicht mit einer einzigen neuen Datei überschreiben. Dies würde zu einem nicht diagnostizierbaren Datenverlust führen. "Zugriff auf den Pfad wird verweigert" ist das Dateisystem, das zurückschlägt, um dies zu verhindern.

Die Ausnahmemeldung ist nicht ideal, kommt jedoch direkt vom Betriebssystem und ist in Stein gemeißelt. Das Framework fügt häufig zusätzliche Überprüfungen hinzu, um bessere Nachrichten zu generieren. Dies ist jedoch ein teurer Test in einem Netzwerk. Perf ist auch ein Feature.

Sie müssen einen Namen wie "C: \ inetpub \ wwwroot \ mysite \ images \ savehere \ mumble.jpg" verwenden. Betrachten Sie Path.Combine () , um den Pfadnamen zuverlässig zu generieren.

Hans Passant
quelle
19
@ Hans Passant Vielen Dank für Ihre etwas harte Aussage. Dadurch sah ich in meinem Code nach, dass ich den gleichen Fehler gemacht hatte.
LosManos
Für mich war das Problem, dass die Datei vorhanden war und der Benutzer sie nicht ersetzen konnte
VinnyG
Hah! Ich habe genau das Gleiche getan.
Jakejgordon
Vielleicht sollte dieser Thread gesperrt werden, um vor "Ich auch!" Zu schützen. Antworten. Weil ich auch! In meinem Fall sollte ich hinzufügen, dass ich mich darüber ärgere, dass für die SaveAs-Methode eines HttpPostedFileBase-Objekts zusätzlich zum Pfad ein Name erforderlich ist, da der Name eine weitere Eigenschaft des Objekts ist. Natürlich könnte man es auf diese Weise anders benennen.
Ralph
1
Ich habe diesen Fehler beim Versuch, eine Datei in einem Komponententest zu schreiben (nichts mit IIS oder irgendetwas Webbezogenem zu tun), und die Fehlermeldung ist so vage. Warum steht in den Zeilen "Kann \ Pfad \ zu \ Datei nicht als Datei öffnen" nichts?
MarioDS
22

Ich hatte das gleiche Problem beim Versuch, eine Datei auf dem Server zu erstellen (eigentlich eine Datei, die eine Kopie einer Vorlage ist).

Hier ist die vollständige Fehlermeldung:

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

Ich habe einen neuen Ordner Templatesim IIS-App-Ordner hinzugefügt . Eine sehr wichtige Sache in meinem Fall ist, dass ich dem IUSR-Benutzer in diesem Ordner die Schreibberechtigung (Gravar) erteilen musste. Möglicherweise müssen Sie auch geben Network Serviceund ASP.NET v$.#die gleiche Schreibberechtigung.

Geben Sie hier die Bildbeschreibung ein

Danach funktioniert alles wie erwartet.

Leniel Maccaferri
quelle
12

Ich hatte genau das gleiche Problem.

Die Lösung bestand darin, dass die Datei, auf die ich zugreifen wollte , schreibgeschützt war , da sie aus einer schreibgeschützten Vorlagendatei kopiert wurde.

<facepalm />

Ruskin
quelle
Die Altova AltovaXML-Anwendungsklasse (DCOM) tut dies. Verursachte mir Probleme.
Mike D
Damit meine ich, dass es etwas Ähnliches wie die folgende Zeile verwenden muss, was bedeutet, dass XSLT nicht schreibgeschützt sein darf. 'FileStream ms = neuer FileStream (Pfad, FileMode.Open, FileAccess.ReadWrite);'
Mike D
1
Hier ist auch ein <facepalm /> von mir. Oh und ... Danke, schreibgeschützt war auch mein Problem.
Cătălin Rădoi
7

Ich habe dieses Problem, wenn ich versuche, die Datei zu speichern, ohne den Dateinamen festzulegen.

Alter Code

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

Arbeitscode

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

Mein Problem war, dass ich nur um Lesezugriff bitten musste:

FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);
Jesus
quelle
1
Bingo - das hat mich auch gebissen! Danke für den Beitrag!
paulsm4
4

Welche Identität hat Ihr Anwendungspool für die Webanwendung, die ausgeführt wird? Versuchen Sie zur Fehlerbehebung, einen neuen App-Pool mit beispielsweise Netzwerkdienst als Identität zu erstellen, und lassen Sie Ihre Webanwendung den von Ihnen erstellten neuen App-Pool verwenden, um festzustellen, ob der Fehler weiterhin besteht.

Ta01
quelle
4

Der folgende Tipp ist keine Antwort auf die ursprüngliche Frage dieses Threads, könnte aber einigen anderen Benutzern helfen, die auf dieser Webseite landen, nachdem sie denselben dummen Fehler gemacht haben, den ich gerade gemacht habe ...

Ich habe versucht, ein ASP.Net FileUpload-Steuerelement zum Hochladen seiner Datei an eine Netzwerkadresse zu erhalten, die eine " versteckte Freigabe " enthielt , nämlich:

\ MyNetworkServer \ c $ \ SomeDirectoryOrOther

Ich habe es nicht verstanden Wenn ich die Webseite im Debug-Modus in Visual Studio ausführen würde, würde es gut funktionieren. Bei der Bereitstellung des Projekts, das über einen Benutzer des Anwendungspools ausgeführt wurde, wurde dieses Netzwerkverzeichnis jedoch nicht gefunden.

Ich hatte überprüft, unter welchem ​​Benutzer meine IIS-Site ausgeführt wurde, diesem Benutzer die vollständigen Berechtigungen für dieses Verzeichnis auf dem Server " MyNetworkServer " usw. usw. erteilt , aber nichts funktionierte.

Der Grund (natürlich!) Ist, dass nur Administratoren diese verborgenen Laufwerksfreigaben "sehen" können.

Meine Lösung bestand einfach darin, eine "normale" Freigabe für zu erstellen

\ MyNetworkServer \ SomeDirectoryOrOther

und dies beseitigte den Fehler "Zugriff auf den Pfad ... wird verweigert". Der FileUpload konnte den Befehl erfolgreich ausführen

fileUpload.SaveAs(networkFilename);

Hoffe, das hilft einigen anderen Benutzern, die den gleichen Fehler machen, den ich gemacht habe!

Beachten Sie auch, dass IIS7 beim Hochladen großer Dateien (über 4 MB) die Datei web.config an zwei Stellen ändern muss . Klicken Sie auf diesen Link, um zu lesen, was Sie tun müssen: Hochladen großer Dateien in ASP.Net

Mike Gledhill
quelle
4

Bitte fügen Sie Ihrem Ordner die Vollzugriffsberechtigung IIS_IUSERS hinzu. Sie finden diese Option auf der Registerkarte Sicherheit in den Ordnereigenschaften. Finden Sie diese Option und Benutzer in diesem Bild

Ali Rasouli
quelle
Schlechter Rat. IIS_USERS willkürlich "volle Kontrolle" zu geben - ohne sorgfältige Überlegung - ist das moralische Äquivalent zu "Krankenschwester - Kettensäge";)
paulsm4
4

Ich habe mit dieser Einstellung gelöst:

IIS> Anwendungspools> [Ihre Site]> Erweiterte Einstellungen ...> Identität> Integrierte Verbindung> LocalSystem

Mohammad Hossein Ganjyar
quelle
2
Dies gibt Ihrer Website LocalAdmin-Berechtigungen. Dies ist ein Sicherheitsrisiko.
Rich-Lang
1
Führen Sie Ihre Website NIEMALS unter dem LocalSystem-Konto aus. JE. ZEITRAUM.
Mihail Shishkov
@MihailShishkov warum?
Mohammad Hossein Ganjyar
2
@MohammadHosseinGanjyar LocalSystem hat Administratorrechte für das System. Wenn Sie die Website unter diesem Konto ausführen, geben Sie ihr im Grunde die Schlüssel für das gesamte System und wahrscheinlich für das gesamte lokale Netzwerk, in dem sich der Server befindet. Das heißt, wenn ein Angreifer einen Weg findet, Ihre Website auszunutzen, werden die Website und das gesamte System verschraubt. Das ist der Grund, warum Privilegien / Rechte und Konten überhaupt existieren. Als Faustregel gilt: Keine Software sollte mit größeren Berechtigungen ausgeführt werden, als sie für ihre Arbeit benötigt. Zum Beispiel benötigt Blog-Site nicht das Recht, D: Laufwerk zu formatieren
Mihail Shishkov
2

Mein Problem war so etwas:

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

aber anstatt path zu verwenden, sollte ich File.FullName verwenden ... Ich weiß nicht, ob es jemand anderem helfen wird, nur meine eigenen Erfahrungen mit diesem gegebenen Fehler weiterzugeben!

Tarcísio Luna
quelle
2
  1. Ändern Sie die Einstellung vom integrierten Konto in ein benutzerdefiniertes Konto und geben Sie den Benutzernamen und das Kennwort des anderen Servers ein.

  2. Behalten Sie die Einstellung als integriert bei (anstelle des klassischen Modus).

uday
quelle
1

Vielleicht hilft es dir.

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

Machen Sie das Verzeichnis savehere zum virtuellen Verzeichnis und erteilen Sie der Systemsteuerung Lese- / Schreibrechte

Harter Baid
quelle
Run Inetmgr.exe dann gehen Sie zu Ihrem Ordner savehere unter mysite (Web - Anwendung / Website in IIS) auf der linken Seite sein wird , wo DefaultApp befindet, ich hoffe , dass u bekam ich sage
Harsh Baid
0

Hatte ein Verzeichnis mit dem gleichen Namen wie die Datei, die ich schreiben wollte, damit die Leute auch darauf achten können.

Samuel
quelle
0

Dieses Problem ist bei der Entwicklung auf meiner lokalen Workstation aufgetreten.

Nach mehreren erfolglosen iisresetAufrufen habe ich diese Situation durch einen Neustart meines Computers behoben .

Rückblickend kann ein offenes Dateihandle Probleme verursacht haben.

Jim G.
quelle
0

In meinem Fall musste ich eine .NET-Autorisierungsregel für die Website in IIS hinzufügen.

Ich habe eine Regel hinzugefügt, um anonyme Benutzer zuzulassen.

.NET-Autorisierungsregeln

GerardBeckerleg
quelle
0

Ich hatte das gleiche Problem, aber ich habe es behoben, indem ich die Datei an einem anderen Ort gespeichert und dann kopiert und an der Stelle eingefügt habe, an der ich sie haben wollte. Ich habe die Option verwendet, um die vorhandene Datei zu ersetzen, und das hat den Trick für mich getan. Ich weiß, dass dies nicht der effizienteste Weg ist, aber es funktioniert und dauert weniger als 15 Sekunden.

Samuel Nde
quelle
0

Ich hatte große Probleme damit, insbesondere im Zusammenhang mit meinem lokal ausgeführten Code, aber als ich ihn auf IIS ausführen musste, wurde dieser Fehler ausgelöst. Ich habe festgestellt, dass das Hinzufügen eines Häkchens zu meinem Code und das Erstellen des Ordners durch die Anwendung beim ersten Ausführen das Problem behoben hat, ohne dass die Ordnerberechtigungen durcheinander gebracht werden mussten.

So etwas, bevor Sie Ihre Methode aufrufen, die den Ordner verwendet

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

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

Wenn Sie diese Fehlermeldung beim Hochladen von Dateien in der Subdomain erhalten und in Ihrer ordnungsgemäß funktionieren, gehen Sie wie localhostfolgt vor:

Lösung:

Plesk Panel

  • Melden Sie sich bei Ihrem Plesk Panel an. Wählen Sie Ihre Subdomain aus, bei der ein Fehler auftritt.
  • Klicken Sie auf Hosting-Einstellungen .
  • Wählen Sie Zusätzliche Schreib- / Änderungsberechtigungen und Übernehmen.

CPanel

  • Ich bin mir nicht sicher, welche Optionen in CPanel verfügbar sind. Wenn Sie dem Verzeichnis jedoch die Berechtigung erteilen (in CPanel muss es sich um eine Dezimalzahl wie 777, 755 handeln), wird der Fehler behoben.

Weitere Details finden Sie hier

Grund für den Fehler:

  • Nehmen wir an, es FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*))wird Ihr Code sein, um Ihre Dateien in den Upload-Pfad zu verschieben.
  • Server.MapPathgibt Ihnen den physischen Pfad (Real Path) des Verzeichnisses. Ihre Subdomain verfügt jedoch möglicherweise nicht über die Berechtigung zum Zugriff auf den physischen Pfad.

  • Wenn Sie der Subdomain die Berechtigung zum Zugriff auf Schreib- / Änderungsberechtigungen erteilen, wird das Problem behoben.

Guruprasad Bhat
quelle
0

Sie können versuchen, zu überprüfen, ob Ihre Web-Eigenschaften für das Projekt nicht zu IIS Express gewechselt sind, und sie wieder in IIS Local ändern

AMykowski
quelle
0

Stellen Sie sicher, dass Ihr Ziel in System.IO.Delete(string file)eine Datei ist, die vorhanden ist. Möglicherweise liegt ein Fehler in Ihrem Code vor, als würden Sie nicht den richtigen Dateinamen an die Methode übergeben, oder Ihr Ziel ist ein Ordner. In diesen Fällen wird Folgendes angezeigt: "Der Zugriff auf den Pfad wird als Fehler verweigert".

Mohammad Yoosefiyan
quelle
-1

Ich habe ein virtuelles Verzeichnis mit voller Berechtigung erstellt und dort die ffmpeg-Quell- und Videodateien hinzugefügt, sodass es schließlich Sinn machte, da es von jedem zugänglich sein kann.

Kamila
quelle