Warum wird der Zugriff auf den Pfad verweigert?

156

Ich habe ein Problem, bei dem ich versuche, meine Datei zu löschen, aber ich erhalte eine Ausnahme.

if (result == "Success")
{
     if (FileUpload.HasFile)
     {
         try
         {
              File.Delete(Request.PhysicalApplicationPath + app_settings.login_images + txtUploadStatus.Text);
              string filename = Path.GetFileName(btnFileUpload.FileName);
              btnFileUpload.SaveAs(Request.PhysicalApplicationPath + app_settings.login_images + filename);
         }
         catch (Exception ex)
         {
               Message(ex.ToString());
         }
      }
}

Außerdem sollte ich beachten, dass der Ordner, aus dem ich löschen möchte, die volle Kontrolle über die Netzwerkdienste hat.

Die vollständige Ausnahmemeldung lautet:

System.UnauthorizedAccessException: Der Zugriff auf den Pfad "C: \ Benutzer \ gowdyn \ Dokumente \ Visual Studio 2008 \ Projekte \ hybrid \ hybrid \ temp_loginimages \ enviromental.jpg" wird verweigert. at System.IO .__ Error.WinIOError (Int32 errorCode, String MaybeFullPath) at System.IO.File.Delete (String path) at hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (Objektabsender, EventArgs e) in C: \ Users \ gd Dokumente \ Visual Studio 2008 \ Projekte \ hybrid \ hybrid \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs: Zeile 242

Irgendwelche Ideen?

Nick Gowdy
quelle
4
Was ist an der Ausnahme nicht klar? Das Konto, unter dem die Anwendung ausgeführt wird, hat keine Zugriffsrechte auf die Datei / den Ordner.
Oded
8
Ich verstehe, was die Ausnahme sagt. Das Problem ist, dass diese Funktionalität von einigen Benutzern verwendet wird, die Bilder mithilfe des Systems ändern müssen. Ein Teil davon besteht darin, Bilder zu ersetzen, indem das alte Bild gelöscht und ein neues Bild gespeichert wird.
Nick Gowdy
Überprüfen Sie Ihre Zugriffsberechtigungen für den Ordner. Geben Sie dem Ordner die richtigen Berechtigungen auf der Registerkarte Sicherheit im Eigenschaftenfenster
Gasroot
6
Die Ausnahme ist überhaupt nicht informativ. Es sagt Ihnen nicht: A. Welcher Principal versucht, auf die Ressource zuzugreifen? B. Welche Berechtigung benötigt er? Um dies herauszufinden, müssen Sie Windows SysInternals installieren und den Pfadzugriff überwachen.
ATL_DEV

Antworten:

184

Nach File.Delete-Methode ...

Ein UnauthorizedAccessExceptionbedeutet eines von 4 Dingen:

  • Der Anrufer verfügt nicht über die erforderliche Berechtigung.
  • Die Datei ist eine ausführbare Datei, die verwendet wird.
  • Pfad ist ein Verzeichnis.
  • Der Pfad hat eine schreibgeschützte Datei angegeben.
CrazyTim
quelle
76
Pfad ist ein Verzeichnis. Peinlich für mich: /
Per G
4
Ist mir gestern Facepalm passiert . Ich hasse diese mehrdeutigen Ausnahmemeldungen :(
Broken_Window
1
Ich hatte über 6 Stunden lang Probleme und nachdem ich mir Ihre Antwort angesehen hatte, stellte ich fest, dass der Pfad ein Verzeichnis war ... danke a ton @CrazyTim ..
Benutzer M
6
Path is a directory.Danke für diesen Tipp :) Es hat mir geholfen.
Sidron
8
Oh mein ... Pfad ist ein Verzeichnis. Vielen Dank, dass Sie Microsoft. Das ist SEHR unbefugter Zugriff.
SeriousM
181

Ich hatte auch das Problem, daher stolperte ich über diesen Beitrag. Ich habe die folgende Codezeile vor und nach dem Kopieren / Löschen hinzugefügt.

Löschen

File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);

Kopieren

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);
Riaan de Lange
quelle
17
Ich habe "Jeder" die vollständigen Berechtigungen für den Ordner erteilt, ohne Erfolg. Irgendwie funktionierten diese Dateiattribute jedoch. Vielen Dank. Ich wünschte, MS würde sich endlich für ein angemessenes Sicherheitsmodell entscheiden. Der Versuch herauszufinden, warum das Kopieren / Löschen alle paar Jahre explodiert, ist gelinde gesagt frustrierend.
Steve
13
SetAttributes Normal war der Trick für mich - Ich habe versucht, File.Copy und überschreiben eine schreibgeschützte Datei ..
Tom Hunter
6
Der Zugriff auf den Pfad wird verweigert, was nicht bedeutet, dass die Datei einfach schreibgeschützt ist (da Sie tatsächlich Zugriff auf den Pfad haben!). Meiner Meinung nach sollte die Fehlermeldung geändert werden. Trotzdem danke für den Hinweis!
MBoros
1
Ich habe das Programm als Administrator ausgeführt und das Problem war behoben.
Santiago Villafuerte
5
Wie hilft das Festlegen eines Attributs nach einem Kopiervorgang? Wird das Programm nicht bereits bei der Kopieranweisung abstürzen? Sollte es vor dem Kopiervorgang genauso sein wie der Löschvorgang?
Vibhore Tanwer
31

Dies ist ein altes Problem, aber ich bin beim Suchen darauf gestoßen. Es stellt sich heraus, dass mir die eigentliche Dateinamenkomponente im Speicherpfad für SaveAs fehlte ...

string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD
Andrew Edvalson
quelle
18

Wenn ein Benutzer versucht, eine Verbindung zu Ihrer Website herzustellen , weist IIS die Verbindung dem Konto IUSER_ComputerName zu , wobei ComputerName der Name des Servers ist, auf dem IIS ausgeführt wird. Standardmäßig ist das Konto IUSER_ComputerName Mitglied der Gruppe Gäste. Diese Gruppe unterliegt Sicherheitsbeschränkungen. Versuchen Sie, auf IUSER_ComputerName in diesem Ordner zuzugreifen

Hier ist eine sehr gut beschriebene Antwort zur IIS-Sicherheit

Hoffe das hilft

Arsen Mkrtchyan
quelle
Danke, das hat geholfen. Berechtigung für IIS_IUSRS-Benutzer.
Tom
13

Klicken Sie mit der rechten Maustaste auf Visual Studio und klicken Sie auf Als Administrator ausführen

Alexander Zaldostanov
quelle
Dies war die Lösung für mein File.Move-Problem auf einem Windows 8.1 Enterprise-Computer, auf dem ich lokaler Administrator war, und nichts anderes hatte einen Einfluss auf die Dateien.
Robert Kerr
13

Ich habe den Fehler erhalten, weil ich nicht wusste, dass das Ziel eine Datei sein sollte. Ich hatte einen Ordner als zweiten Parameter (der in cmd funktioniert). und ich habe bekommen, Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.weil C # dort File.Moveeine Datei haben möchte, nicht nur für den ersten Parameter, sondern auch für den zweiten. Wenn Sie also ein Verzeichnis als zweiten Parameter eingeben, wird versucht, eine Datei zu schreiben, wie c:\crpwenn Sie ein Verzeichnis namens haben c:\crp.

das wäre falsch File.Move(args[0],"c:\\crp");

Das wäre also richtig File.Move(args[0],"c:\\crp\\a.a");

Das gleiche gilt für File.Copy

Barlop
quelle
1
Danke dir! Dies löste indirekt ein Problem, bei dem eine API ein Ziel erwartete, das ich als Verzeichnis angegeben hatte, ohne zu bemerken, dass es den Dateinamen enthalten musste (da dem Objekt selbst ein Dateiname zugeordnet ist).
Austin Salgat
7

Wenn es sich um eine IIS-Website handelt, bei der das Problem auftritt, überprüfen Sie die Eigenschaft Identität der erweiterten Einstellungen für den Anwendungspool, den die Site oder Anwendung verwendet. Möglicherweise stellen Sie fest, dass ApplicationPoolIdentity festgelegt ist. In diesem Fall ist dies der Benutzer, der Zugriff auf den Pfad haben muss.

Sie können auch den alten Stil verwenden und einfach die Identität auf Netzwerkdienst setzen und dem Netzwerkdienstbenutzer Zugriff auf den Pfad gewähren.

Bjørn Otto Vasbotten
quelle
3

Sie müssen die Berechtigungen des Ordners ändern, aus dem Sie löschen / in dem Sie speichern möchten. Klicken Sie mit der rechten Maustaste auf den enthaltenen Ordner und verwenden Sie die Registerkarte Sicherheit, um Änderungsrechte für den Benutzer zuzulassen , unter dem Ihre Anwendung ausgeführt wird.

Brissles
quelle
Sie gehen davon aus, dass er Administrator seiner Maschine ist. Wenn dies eine Arbeitsmaschine ist und er nur ein Benutzer ist. Sie haben die Berechtigungen wahrscheinlich aus einem bestimmten Grund so eingerichtet. Wir müssen nur davon ausgehen, dass
MethodMan
1
Es ist eine Arbeitsmaschine und ich bin ein Power-User. Ich melde mich nicht als Administrator an. Die Eigenschaften des Image-Ordners wurden geändert, sodass die Netzwerkdienste vollen Zugriff haben. Aber das machte keinen Unterschied.
Nick Gowdy
1
Ich habe gerade "Jeder" mit vollem Zugriff auf den Ordner und "voilá"
MarceloBarbosa
3

Die Ausnahme, die ausgelöst wird, wenn das Betriebssystem den Zugriff aufgrund eines E / A-Fehlers oder eines bestimmten Sicherheitstyps verweigert.

Ich habe das Gleiche getroffen. Stellen Sie sicher, dass die Datei NICHT VERSTECKT ist.

Ron H.
quelle
3

Ich habe dieses Problem auch festgestellt, als mein Fensterdienst die Ausnahme auslöste

System.UnauthorizedAccessException: Access to the path "C:\\Order\\Media
44aa4857-3bac-4a18-a307-820450361662.mp4" is denied.

Als Lösung habe ich das mit meinem Dienst verknüpfte Benutzerkonto überprüft (siehe Abbildung unten)

Geben Sie hier die Bildbeschreibung ein

In meinem Fall war es also NETWORK SERVICE

Gehen Sie dann zu den Ordnereigenschaften , um zu überprüfen, ob das zugehörige Benutzerkonto auch auf der Registerkarte "Berechtigung" vorhanden ist. Es fehlte in meinem Fall und als ich es hinzufügte, wurde mein Problem behoben.

Weitere Informationen finden Sie in der folgenden Abbildung

Geben Sie hier die Bildbeschreibung ein

Jitender Kumar
quelle
3

Das gleiche Problem auch für mich, ich zeigte auf den Ordner anstelle der Datei.

Stellen Sie also sicher, dass Sie im Pfad Pfad + Dateiname angeben

System.IO.File.WriteAllBytes("path", bytearray);
jineesh vp
quelle
2

Überprüfen Sie die Eigenschaften Ihrer Dateien. Wenn das schreibgeschützte Element aktiviert ist, deaktivieren Sie es. Dies war mein persönliches Problem mit der UnauthorizedAccessException.

user3238433
quelle
2

Ich habe diesen Fehler bekommen und ihn in einem Moment behoben. Ich weiß nicht, warum alle meine Ordner schreibgeschützt sind. Ich habe die schreibgeschützten Ordner abgebrochen und angewendet. Es ist jedoch weiterhin schreibgeschützt. Also habe ich die Datei in den Stammordner verschoben, es funktioniert - so komisch.

MOLLMY
quelle
2

Eine UnauthorizedAccessException-Ausnahme wird ausgelöst, wenn das Betriebssystem den Zugriff aufgrund eines E / A-Fehlers oder eines Sicherheitsfehlers verweigert.

Wenn Sie versuchen, auf eine Datei oder einen Registrierungsschlüssel zuzugreifen, stellen Sie sicher, dass dieser nicht schreibgeschützt ist .

reza.Nikmaram
quelle
2

Wenn Sie BitDefender verwenden, besteht eine gute Chance, dass es sichere Dateien enthält Ihren Betrieb blockiert. Dies ist eine Form des Ransomware-Schutzes, die mit einigen fortgeschritteneren Versionen geliefert wird.

Stellen Sie sicher, dass Sie Ihrer Anwendung Zugriff in BitDefender gewähren, und versuchen Sie es erneut.

Weitere Details finden Sie auf dieser BitDefender-Support-Seite .

Vlad Schnakovszki
quelle
1

Ich hatte das gleiche Problem auf einer neu verschobenen Website auf einem gemeinsam genutzten Server. Durch das Webhost-Panel (DotNetPanel) gelöst, wobei true die Option "Schreibberechtigungen zulassen" aktiviert ist. Wenn Sie sich also auf einem gemeinsam genutzten Server befinden, bevor Sie den gesamten Code überprüfen, der einen Blick auf die Serverkonfiguration wert ist, können Sie viel Zeit sparen.

Drakell
quelle
1

Beachten Sie, dass Sie, wenn Sie versuchen, über Ihren Code auf einen Pfad für freigegebene Ordner zuzugreifen, dem physischen Ordner nicht nur über die Registerkarte "Sicherheit" die richtigen Berechtigungen erteilen müssen. Sie müssen den Ordner auch über die Registerkarte "Freigeben" für den entsprechenden Benutzer des App-Pools "freigeben"

Kacho
quelle
1

Ich war mit diesem Fehler konfrontiert, weil

Manchmal, wenn ich Combineden Pfad mit Dateiname undFileName = ""

Es wird Path Directorykein fileProblem, wie oben erwähnt

Sie müssen also nachsehen, FileNameob dies der Fall ist

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));
Basheer AL-MOMANI
quelle
1

Ich hatte den genauen Fehler beim Löschen einer Datei. Es handelte sich um einen Windows-Dienst, der unter einem Dienstkonto ausgeführt wurde und ein PDF-Dokument nicht aus einem freigegebenen Ordner löschen konnte, obwohl er die vollständige Kontrolle über den Ordner hatte.

Für mich funktionierte die Navigation zur Registerkarte Sicherheit unter Freigegebener Ordner> Erweitert> Freigeben> Hinzufügen.

Ich habe dann das Dienstkonto zur Administratorgruppe hinzugefügt, die Änderungen übernommen und das Dienstkonto konnte dann alle Vorgänge für alle Dateien in diesem Ordner ausführen.

LuTheZy
quelle
1

Für diejenigen, die versuchen, eine UWP-Anwendung (Universal Windows) zu erstellen, sind die Dateiberechtigungen viel eingeschränkter und werden im Allgemeinen standardmäßig verweigert. Es ersetzt auch die Systembenutzerberechtigungen. Sie haben grundsätzlich nur Zugriff auf Dateien in beiden

  • Ihr Installationsort
  • Ihr AppData-Speicherort
  • Dateien über die ausgewählte Datei oder Ordner - Picker
  • In Ihrem App-Manifest angeforderte Standorte

Weitere Informationen finden Sie hier => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions

Tezra
quelle
1

In meinem Fall war das Problem Norton. Mein internes Programm verfügt nicht über die richtige digitale Signatur. Beim Versuch, eine Datei zu löschen, wurde die UnauthorizedAccessException ausgegeben.

Geben Sie hier die Bildbeschreibung ein

Wenn Sie eine Benachrichtigung erhalten, können Sie diese von dort aus bearbeiten. In meinem Fall gab es keine Benachrichtigung, die ich bemerkte. So verhindern Sie, dass Norton das Programm blockiert.

  1. Öffnen Sie Norton
  2. Klicken Sie auf den Abwärtspfeil
  3. Klicken Sie auf Verlauf
  4. Aktivität nach Programm suchen
  5. Klicken Sie auf Weitere Optionen
  6. Klicken Sie auf Prozess ausschließen
D_Bester
quelle
0

Auch ich hatte das gleiche Problem, als ich versuchte, dies nach der Bereitstellung auf dem Server zu tun:

dirPath = Server.MapPath(".") + "\\website\\" + strUserName;
if (!Directory.Exists(dirPath))
{
    DirectoryInfo DI = Directory.CreateDirectory(dirPath);
}
string filePath = Server.MapPath(".") + "\\Website\\default.aspx";
File.Copy(filePath, dirPath + "\\default.aspx", true);
File.SetAttributes(dirPath + "\\default.aspx", FileAttributes.Normal);

Ich habe einer anderen Gruppe, einschließlich des Administrators, die Erlaubnis in IIS erteilt, und mein Problem wurde gelöst.

Manish Singh
quelle
0

Ich habe festgestellt, dass dieser Fehler im DESIGN-MODUS im Gegensatz zu? Ausführungsmodus ... Wenn Sie beispielsweise ein Klassenmitglied erstellen, für das Zugriff auf eine INI- oder HTM-Datei (Konfigurationsdatei, Hilfedatei) erforderlich ist, möchten Sie das Element in der Deklaration möglicherweise NICHT initialisieren, sondern später initialisieren in FORM_Load () etc ... Wenn Sie initialisieren ... Verwenden Sie eine Guard-IF-Anweisung:

    /// <summary>FORM: BasicApp - Load</summary>
    private void BasicApp_Load(object sender, EventArgs e)
    {
        // Setup Main Form Caption with App Name and Config Control Info
        if (!DesignMode)
        {
            m_Globals = new Globals();
            Text = TGG.GetApplicationConfigInfo();
        }
    }

Dies verhindert, dass der MSVS Designer versucht, eine INI- oder HTM-Datei zu erstellen, wenn Sie sich im Entwurfsmodus befinden.

Terry
quelle
0

Dieser Fehler wurde ausgelöst, als ich versuchte, einen Ordner sehr schnell umzubenennen, nachdem er entweder verschoben oder erstellt wurde.

Eine einfache System.Threading.Thread.Sleep(500);Lösung:

void RenameFile(string from, string to)
{
   try
   {   
      System.IO.File.Move(from, to)      
   }   
   catch 
   {  
       System.Threading.Thread.Sleep(500);      
       RenameFile(from, to);      
   }   
}
Arjan de Bruijn
quelle
Denken Sie, es wäre besser, wenn Sie vor dem Verschieben überprüfen würden, ob der Ordner vorhanden ist, anstatt eine halbe Sekunde zu schlafen. Wenn das Betriebssystem ausgelastet ist, dauert der vorherige Umzug möglicherweise länger als eine halbe Sekunde, und Sie kehren zum selben Problem zurück.
Paul Zahra
Dieser Code ist sehr gefährlich. Es wiederholt die RenameFile-Methode, egal welche Ausnahme ausgelöst wird! Es könnte zum Absturz der App führen, wenn die Ursache der Ausnahme ein tatsächliches Berechtigungsproblem ist
Hossein Shahdoost
0

In meinem speziellen Fall habe ich wiederholt 10000 Ordner erstellt und gelöscht. Es scheint mir, dass das Problem darin bestand, dass der zugrunde liegende Directory.Delete(path, true)Betriebssystemmechanismus die Dateien möglicherweise immer noch von der Festplatte löscht , obwohl die Methode zurückkehrt. Und wenn ich unmittelbar nach dem Löschen alter Ordner anfange, neue Ordner zu erstellen, sind einige von ihnen immer noch gesperrt, da sie noch nicht vollständig gelöscht wurden. Und ich erhalte die System.UnauthorizedAccessException: "Der Zugriff auf den Pfad wird verweigert".

Geben Sie hier die Bildbeschreibung ein

Die Verwendung von Thread.Sleep(5000)after Directory.Delete(path, true)löst dieses Problem. Ich stimme absolut zu, dass dies nicht sicher ist, und ich ermutige niemanden, es zu verwenden. Ich würde gerne hier einen besseren Ansatz finden, um dieses Problem zu lösen und meine Antwort zu verbessern. Jetzt gebe ich nur eine Idee, warum diese Ausnahme auftreten kann.

class Program
{
    private static int numFolders = 10000;
    private static string rootDirectory = "C:\\1";

    static void Main(string[] args)
    {
        if (Directory.Exists(rootDirectory))
        {
            Directory.Delete(rootDirectory, true);
            Thread.Sleep(5000);
        }

        Stopwatch sw = Stopwatch.StartNew();
        CreateFolder();
        long time = sw.ElapsedMilliseconds;

        Console.WriteLine(time);
        Console.ReadLine();
    }

    private static void CreateFolder()
    {
        var one = Directory.CreateDirectory(rootDirectory);

        for (int i = 1; i <= numFolders; i++)
        {
            one.CreateSubdirectory(i.ToString());
        }
    }
}
Aleksei Mialkin
quelle
0

Überprüfen Sie zunächst den Pfad, ob das Doppelpunktzeichen (:) nach dem Laufwerksbuchstaben fehlt oder nicht. Wenn der Doppelpunkt nicht fehlt, können Sie überprüfen, ob für diesen Pfad eine Zugriffs- / Schreibberechtigung erteilt wurde. Ich hatte das gleiche Problem und mir fehlte nur der Doppelpunkt, die Erlaubnis und alles andere war in Ordnung.

C:\folderpath

wird aber gut funktionieren,

C\folderpath .........(missing colon)

gibt Ihnen Zugriffsverweigerungsfehler.

Vijay Dodamani
quelle
0

Ich habe versucht, System.IO.File.OpenWrite (Pfad) zu verwenden.

und es hat nicht funktioniert, weil ich OpenWrite () nur einen Pfad zu einem Verzeichnis übergeben habe, aber es erfordert einen Pfad bis zu der Datei, die Sie schreiben möchten. Daher muss ein vollständiger Pfad einschließlich der Dateinamenerweiterung am Ende an OpenWrite übergeben werden, um UnauthorizedAccessException zu vermeiden

SeanMC
quelle
0

Ich bin auch auf diesen Beitrag gestoßen, weil ich mich mit dem gleichen Problem befasst habe. Es sieht so aus, als ob die Datei verwendet wird und daher nicht in die Datei schreiben kann. Obwohl nicht in der Lage, es herauszufinden, welcher Prozess es verwendet. Der andere Benutzer, der in diesem Feld angemeldet war, hat sich abgemeldet. Es werden keine Benutzer angezeigt, die ihn halten. Irgendwelche schnellen Tipps, wie man dasselbe findet.

Danke, Lakshay (Entwickler)

Lakshay Gupta
quelle
Stellen Sie in Ihrer Antwort keine neue Frage, sondern versuchen Sie, die Frage des Originalplakats mit hilfreichen Informationen zu beantworten. Bei Ihrer eigenen Frage suchen Sie bitte zuerst im Stackoverflow nach denselben oder ähnlichen Fragen. Wenn Sie keine finden, stellen Sie eine neue Frage, die dieser Anleitung folgt: Wie man eine gute Frage stellt
alev
0

Um dieses Problem zu lösen, folge ich dem Scot Hanselman-Ansatz bei Debugging System.UnauthorizedAccessException (häufig gefolgt von: Zugriff auf den Pfad wird verweigert) Artikel, der Code mit Beispiel ist unten:

class Program
{
    static void Main(string[] args)
    {
        var path = "c:\\temp\\notfound.txt";
        try
        {
            File.Delete(path);
        }
        catch (UnauthorizedAccessException)
        {
            FileAttributes attributes = File.GetAttributes(path);
            if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                attributes &= ~FileAttributes.ReadOnly;
                File.SetAttributes(path, attributes);
                File.Delete(path);
            }
            else
            {
                throw;
            }
        }
    }
}
Antonio Leonardo
quelle