Dlaczego odmowa dostępu do ścieżki?


156

Mam problem polegający na tym, że próbuję usunąć plik, ale pojawia się wyjątek.

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());
         }
      }
}

Powinienem również zauważyć, że folder, z którego próbuję usunąć, ma pełną kontrolę nad usługami sieciowymi.

Pełny komunikat o wyjątku to:

System.UnauthorizedAccessException: Odmowa dostępu do ścieżki „C: \ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ temp_loginimages \ enviromental.jpg”. w System.IO .__ Error.WinIOError (Int32 errorCode, String możeFullPath) w System.IO.File.Delete (String path) w hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (Object sender, EventArgs e) w C: \ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs: wiersz 242

Jakieś pomysły?


4
Co nie jest jasne, jeśli chodzi o wyjątek? Konto, na którym działa aplikacja, nie ma uprawnień dostępu do pliku / folderu.
Oded

8
Rozumiem, co mówi wyjątek. Problem polega na tym, że ta funkcja jest używana przez niektórych użytkowników, którzy muszą modyfikować obrazy za pomocą systemu. Częścią tego jest zastępowanie obrazów poprzez usuwanie starego obrazu i zapisywanie nowego obrazu.
nick gowdy

Sprawdź swoje uprawnienia dostępu do folderu. nadaj odpowiednie uprawnienia do folderu za pomocą zakładki bezpieczeństwa z okna właściwości
katalog gazowy

6
Wyjątek w ogóle nie ma charakteru informacyjnego. Nie mówi ci: A. Jaki podmiot próbuje uzyskać dostęp do zasobu B. Jakich uprawnień potrzebuje. Aby się tego dowiedzieć, wymaga zainstalowania systemu Windows SysInternals i monitorowania dostępu do ścieżki.
ATL_DEV

Odpowiedzi:


184

Zgodnie z metodą File.Delete ...

UnauthorizedAccessExceptionOznacza jedną z 4 rzeczy:

  • Dzwoniący nie ma wymaganych uprawnień.
  • Plik jest plikiem wykonywalnym, który jest w użyciu.
  • Ścieżka to katalog.
  • Ścieżka określa plik tylko do odczytu.

76
Ścieżka to katalog. Żenujące dla mnie: /
Per G

4
Zdarzyło mi się wczoraj facepalm . Nienawidzę tych niejednoznacznych komunikatów o wyjątkach :(
Broken_Window

1
Walczyłem przez ponad 6 godzin i po spojrzeniu na twoją odpowiedź zobaczyłem, że ścieżka była katalogiem ... wielkie dzięki @CrazyTim ..
Użytkownik M

6
Path is a directory.dzięki za tę wskazówkę :) Pomogło mi.
Sidron

8
O mój ... Ścieżka to katalog. Dziękuję Microsoft. To BARDZO nieautoryzowany dostęp.
SeriousM

181

Ja też miałem problem, stąd natknąłem się na ten post. Dodałem następujący wiersz kodu przed i po operacji Kopiuj / Usuń.

Usunąć

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

Kopiuj

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);

17
Dałem „Wszystkim” pełne uprawnienia do folderu bez powodzenia. W jakiś sposób te atrybuty plików zadziałały. Dzięki. Chciałbym, żeby stwardnienie rozsiane w końcu zdecydowało się na właściwy model bezpieczeństwa. Próba ustalenia, dlaczego funkcja Kopiuj / Usuń eksploduje co kilka lat, jest co najmniej frustrująca.
Steve,

13
SetAttributes Normal było dla mnie trikiem - próbowałem File.Copy i nadpisać plik tylko do odczytu ...
Tom Hunter

6
Odmowa dostępu do ścieżki nie oznacza, że ​​plik jest tylko do odczytu (ponieważ faktycznie masz dostęp do ścieżki!) Moim zdaniem należy zmienić komunikat o błędzie. Dzięki za podpowiedź!
MBoros,

1
Uruchomiłem program jako Administrator i problem zniknął.
Santiago Villafuerte

5
W jaki sposób pomaga ustawienie atrybutu po operacji kopiowania? Czy program nie ulegnie awarii już podczas kopiowania instrukcji? Czy powinno to być przed operacją kopiowania, tak jak operacja usuwania?
Vibhore Tanwer

31

To stary problem, ale natknąłem się na niego podczas wyszukiwania. Okazuje się, że brakowało mi właściwego składnika nazwy pliku w ścieżce zapisu dla SaveAs ...

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

18

Gdy użytkownik próbuje połączyć się z witryną sieci Web, usługi IIS przypisują połączenie do konta IUSER_ComputerName , gdzie nazwa_komputera to nazwa serwera, na którym są uruchomione usługi IIS. Domyślnie konto IUSER_ComputerName jest członkiem grupy Goście. Ta grupa ma ograniczenia bezpieczeństwa. Spróbuj uzyskać wielki dostęp do IUSER_ComputerName do tego folderu

Tutaj jest bardzo dobrze opisana odpowiedź na temat bezpieczeństwa IIS

Mam nadzieję że to pomoże


Dzięki temu pomogło ... Uprawnienia dla użytkownika IIS_IUSRS.
Tom

13

Kliknij prawym przyciskiem myszy Visual studio i kliknij Uruchom jako administrator


To było rozwiązanie dla mojego problemu File.Move na komputerze z systemem Windows 8.1 Enterprise, na którym byłem administratorem lokalnym, i nic innego nie radziło sobie z plikami.
Robert Kerr

13

Otrzymałem błąd, ponieważ nie zdawałem sobie sprawy, że miejscem docelowym powinien być plik. Jako drugi parametr miałem folder (który działa w cmd). i otrzymałem, Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.ponieważ C # File.Movechce tam plik, nie tylko dla pierwszego parametru, ale także dla drugiego, więc jeśli umieścisz katalog jako drugi parametr, to próbuje napisać plik, tak jak w c:\crpprzypadku katalogu o nazwie c:\crp.

byłoby to niepoprawne File.Move(args[0],"c:\\crp");

Więc to byłoby poprawne File.Move(args[0],"c:\\crp\\a.a");

To samo dotyczy File.Copy


1
Dziękuję Ci! To pośrednio rozwiązało problem polegający na tym, że API oczekiwało miejsca docelowego, które podałem jako katalog, nie zdając sobie sprawy, że musi zawierać nazwę pliku (ponieważ sam obiekt ma skojarzoną nazwę pliku).
Austin Salgat

7

Jeśli jest to witryna sieci Web usług IIS, w której występuje problem, sprawdź właściwość Identity w ustawieniach zaawansowanych puli aplikacji, z której korzysta witryna lub aplikacja. Może się okazać, że jest ustawiona na ApplicationPoolIdentity, aw takim przypadku to użytkownik będzie musiał mieć dostęp do ścieżki.

Możesz też przejść do starego stylu i po prostu ustawić tożsamość na usługę sieciową i przyznać użytkownikowi usługi sieciowej dostęp do ścieżki.


3

Musisz zmodyfikować uprawnienia folderu, z którego próbujesz usunąć / zapisać w. Kliknij prawym przyciskiem myszy folder zawierający i użyj karty Zabezpieczenia, aby zezwolić na modyfikowanie praw użytkownika, w ramach którego działa Twoja aplikacja.


zakładasz, że jest administratorem swojej maszyny ... jeśli to jest maszyna robocza i jest tylko użytkownikiem ... prawdopodobnie ustawili uprawnienia w ten sposób z jakiegoś powodu ... ponieważ możemy tylko założyć
MethodMan

1
To maszyna robocza, a ja jestem zaawansowanym użytkownikiem. Nie loguję się jako administrator. Właściwości folderu obrazów zostały zmodyfikowane, aby usługi sieciowe miały pełny dostęp. Ale to nie miało żadnego znaczenia.
nick gowdy

1
Właśnie dodałem „każdy” z pełnym dostępem do folderu i „voila”
MarceloBarbosa

3

Wyjątek, który jest generowany, gdy system operacyjny odmawia dostępu z powodu błędu we / wy lub określonego typu błędu zabezpieczeń.

Uderzam w to samo. Sprawdź, czy plik NIE JEST UKRYTY.


3

Miałem również do czynienia z tym problemem, gdy moja usługa okien zaczęła rzucać wyjątek

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

Jako rozwiązanie sprawdziłem konto użytkownika powiązane z moją usługą, jak pokazano na poniższym zrzucie ekranu

wprowadź opis obrazu tutaj

Więc w moim przypadku była to USŁUGA SIECIOWA

A następnie przeszedł do właściwości folderu aby sprawdzić, czy powiązane konto użytkownika istnieje również na karcie uprawnień. Brakowało go w moim przypadku, a kiedy go dodałem i rozwiązałem mój problem.

Aby uzyskać więcej informacji, sprawdź poniższy zrzut ekranu

wprowadź opis obrazu tutaj


3

dla mnie ten sam problem, wskazałem folder zamiast pliku.

więc upewnij się, że w path, podaj ścieżkę + nazwę pliku

System.IO.File.WriteAllBytes("path", bytearray);

2

Sprawdź właściwości plików. Jeśli zaznaczone jest tylko do odczytu, odznacz je. To był mój osobisty problem z wyjątkiem UnauthorizedAccessException.


2

Otrzymałem ten błąd i rozwiązałem go w jednej chwili. Nie wiem, dlaczego wszystkie moje foldery są tylko do odczytu , Anulowałem opcję tylko do odczytu i zastosowałem ją. Jednak nadal jest tylko do odczytu. Więc przeniosłem plik do folderu głównego, działa - tak dziwnie.


2

Wyjątek UnauthorizedAccessException jest generowany, gdy system operacyjny odmawia dostępu z powodu błędu we / wy lub błędu zabezpieczeń.

Jeśli próbujesz uzyskać dostęp do pliku lub klucza rejestru, upewnij się, że nie jest on przeznaczony tylko do odczytu .


2

Jeśli używasz BitDefendera, istnieje duża szansa, że ​​jego Bezpieczne pliki funkcja zablokowała twoją operację. Jest to forma ochrony przed oprogramowaniem typu ransomware, która jest dostępna w niektórych bardziej zaawansowanych wersjach.

Upewnij się, że przyznasz swojej aplikacji dostęp w BitDefender i spróbuj ponownie.

Więcej szczegółów można znaleźć na tej stronie pomocy BitDefender .


1

Miałem ten sam problem na nowo przeniesionej witrynie na współdzielonym serwerze. Rozwiązany za pomocą panelu hosta internetowego (DotNetPanel), ustawiając true, „zezwalaj na zapisywanie”. Więc jeśli jesteś na serwerze współdzielonym przed przejrzeniem całego kodu, warto przyjrzeć się konfiguracji serwera i zaoszczędzić dużo czasu.


1

Należy pamiętać, że jeśli próbujesz dotrzeć do ścieżki folderu współdzielonego z kodu, nie musisz tylko nadawać odpowiednich uprawnień do folderu fizycznego za pośrednictwem zakładki zabezpieczeń. Musisz także „udostępnić” folder odpowiedniemu użytkownikowi puli aplikacji za pośrednictwem karty Udostępnij


1

Miałem do czynienia z tym błędem, ponieważ

Czasami, kiedy ścieżka z nazwy pliku iCombineFileName = ""

Stało się Path Directorynie tym, fileco jest problemem, jak wspomniano powyżej

więc trzeba sprawdzić, FileNamejak to

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));

1

Miałem dokładny błąd podczas usuwania pliku. Była to usługa systemu Windows działająca w ramach konta usługi, która nie mogła usunąć dokumentu .pdf z folderu współdzielonego, mimo że miała pełną kontrolę nad folderem.

Udało mi się przejść do karty Zabezpieczenia w folderze udostępnionym> Zaawansowane> Udostępnij> Dodaj.

Następnie dodałem konto usługi do grupy administratorów, zastosowałem zmiany i konto usługi było wtedy w stanie wykonywać wszystkie operacje na wszystkich plikach w tym folderze.


1

Dla tych, którzy próbują stworzyć aplikację UWP (Universal Windows), uprawnienia do plików są znacznie bardziej ograniczone i ogólnie są domyślnie odrzucane. Zastępuje również uprawnienia użytkowników systemu. Zasadniczo będziesz mieć dostęp tylko do plików w obu

  • Twoja lokalizacja instalacji
  • Twoja lokalizacja AppData
  • Pliki wybrane za pomocą selektora plików lub folderów
  • Lokalizacje żądane w manifeście aplikacji

Możesz przeczytać więcej tutaj, aby uzyskać szczegółowe informacje => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions


1

W moim przypadku problemem był Norton. Mój program wewnętrzny nie ma odpowiedniego podpisu cyfrowego, a gdy próbował usunąć plik, zgłosił wyjątek UnauthorizedAccessException.

wprowadź opis obrazu tutaj

Jeśli dostaniesz powiadomienie, możesz sobie z tym poradzić. W moim przypadku nie dało powiadomienia, że ​​zauważyłem. Oto jak zapobiec blokowaniu programu przez Nortona.

  1. Otwórz Norton
  2. Kliknij strzałkę w dół
  3. Kliknij Historia
  4. Znajdź aktywność według programu
  5. Kliknij Więcej opcji
  6. Kliknij Wyklucz proces

0

Ja również napotkałem ten sam problem, próbując to zrobić po wdrożeniu na serwerze:

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);

Udzieliłem uprawnień w usługach IIS innej grupie, w tym administratorowi, i mój problem został rozwiązany.


0

Odkryłem, że ten błąd może wystąpić w TRYBIE PROJEKTOWANIA, a nie w? tryb wykonywania ... Jeśli robisz coś takiego, jak tworzenie elementu klasy, który wymaga dostępu do pliku .INI lub .HTM (plik konfiguracyjny, plik pomocy), możesz NIE inicjować elementu w deklaracji, ale zainicjować go później in FORM_Load () etc ... When you DO initialize ... Użyj instrukcji Guard IF:

    /// <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();
        }
    }

Dzięki temu program MSVS Designer nie będzie próbował utworzyć pliku INI lub HTM, gdy jesteś w trybie projektowania.


0

Wystąpił ten błąd, gdy próbowałem bardzo szybko zmienić nazwę folderu po jego przeniesieniu lub utworzeniu.

Proste System.Threading.Thread.Sleep(500);rozwiązanie:

void RenameFile(string from, string to)
{
   try
   {   
      System.IO.File.Move(from, to)      
   }   
   catch 
   {  
       System.Threading.Thread.Sleep(500);      
       RenameFile(from, to);      
   }   
}

Pomyśl, że byłoby lepiej, gdybyś sprawdził, czy folder istnieje przed jego przeniesieniem, zamiast spać przez pół sekundy ... jeśli system operacyjny jest zajęty, poprzedni ruch może zająć więcej niż pół sekundy, a ty wracasz do tego samego problemu.
Paul Zahra,

Ten fragment kodu jest bardzo niebezpieczny. Powtarza metodę RenameFile bez względu na zgłoszony wyjątek! Może to spowodować awarię aplikacji, jeśli przyczyną wyjątku jest rzeczywisty problem z uprawnieniami
Hossein Shahdoost

0

W moim przypadku wielokrotnie tworzyłem i usuwałem 10000 folderów. Wydaje mi się, że problem polegał na tym, że chociaż metoda Directory.Delete(path, true)powraca, podstawowy mechanizm systemu operacyjnego może nadal usuwać pliki z dysku. A kiedy zaczynam tworzyć nowe foldery natychmiast po usunięciu starych, niektóre z nich są nadal zablokowane, ponieważ nie zostały jeszcze całkowicie usunięte. Otrzymuję wyjątek System.UnauthorizedAccessException: „Odmowa dostępu do ścieżki”.

wprowadź opis obrazu tutaj

Używanie Thread.Sleep(5000)after Directory.Delete(path, true)rozwiązuje ten problem. Absolutnie zgadzam się, że nie jest to bezpieczne i nie zachęcam nikogo do korzystania z niego. Chciałbym tutaj znaleźć lepsze podejście do rozwiązania tego problemu, aby poprawić moją odpowiedź. Teraz tylko podpowiadam, dlaczego ten wyjątek może się zdarzyć.

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());
        }
    }
}

0

Najpierw sprawdź ścieżkę, jeśli brakuje znaku dwukropka (:) lub nie ma go po literze dysku. Jeśli nie brakuje dwukropka, możesz sprawdzić, czy przyznano uprawnienia dostępu / zapisu dla tej ścieżki. Miałem ten sam problem i brakowało mi tylko okrężnicy, pozwolenia i wszystko inne było w porządku.

C:\folderpath

będzie działać dobrze, ale

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

da ci błąd odmowy dostępu.


0

Próbowałem użyć System.IO.File.OpenWrite (ścieżka)

i nie zadziałało, ponieważ przekazywałem OpenWrite () tylko ścieżkę do katalogu, ale wymaga to ścieżki do pliku, który chcesz zapisać. Tak więc pełna ścieżka zawierająca nazwę pliku. Rozszerzenie na końcu musi zostać przekazana do OpenWrite, aby uniknąć wyjątku UnauthorizedAccessException


0

Natknąłem się również na ten post, który dotyczy tego samego problemu. Wygląda na to, że plik jest używany i dlatego nie można w nim zapisywać. Chociaż nie jestem w stanie tego rozgryźć, który proces go wykorzystuje. Wylogowano innego użytkownika, który był zalogowany w tym polu, nie widzisz żadnych użytkowników, którzy go przechowują. Wszelkie szybkie wskazówki, jak znaleźć to samo.

Dzięki, Lakshay (programista)


W swojej odpowiedzi nie zamieszczaj nowego pytania, ale spróbuj odpowiedzieć na pytanie z oryginalnego plakatu, podając pomocne informacje. W przypadku własnego pytania wyszukaj najpierw w stackoverflow te same lub podobne pytania. Jeśli nie znajdziesz, zadaj
alev

0

Aby rozwiązać ten problem, postępuję zgodnie z podejściem Scotta Hanselmana w artykule Debugging System.UnauthorizedAccessException (często po którym następuje: Access to the path is denied) , kod z przykładem jest poniżej:

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;
            }
        }
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.