Odmowa dostępu do ścieżki

165

Wiem, że to pytanie było tu zadawane wiele razy, ale nie mogę znaleźć rozwiązania mojego problemu. Próbuję zapisać obraz do folderu w .net c #, ale otrzymuję ten wyjątek:

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)

Dałem pełną kontrolę temu folderowi (savetutaj) do, network servicea iis_iusrsnawet dałem pełną kontrolę, everyoneale nadal otrzymuję ten wyjątek. Próbowałem udzielić dostępu za pośrednictwem eksploratora i menedżera IIS, ale nadal nie mam szczęścia

Robię to w systemie Windows Server 2008 R2 i IIS 7.5. Komu potrzebuję dostępu?

Dzięki

Burjua
źródło
Czy próbowałeś użyć ścieżki względnej do aplikacji? Nie wiem zbyt wiele o serwerze Windows, ale może się zdarzyć, że nie pozwala on na dostęp do ścieżki głównej `C: '.
Michael K
1
Przyszli czytelnicy: sprawdź uprawnienia do pliku.
Ruskin

Odpowiedzi:

94

Musisz dowiedzieć się z puli aplikacji dla witryny sieci Web, pod jaką tożsamością działa (domyślnie jest to Application Pool Identity) i nadać jej odpowiednie uprawnienia.

Oded
źródło
Ok, dzięki, mam 5 basenów, wszystkie mają tożsamość ApplicationPoolIdentity, jak nadać temu uprawnienia?
Burjua
22
@Burjua - poszukaj IIS APPPOOL\DefaultAppPoolużytkownika. Zobacz ten artykuł w oficjalnej witrynie IIS: learn.iis.net/page.aspx/624/application-pool-identities
Oded
1
Ok, jak napisałem w tym artykule dodałem DefaultAppPooli dałem full controldo niego uprawnienia, ale nadal otrzymuję ten sam błąd
Burjua
2
Wiem, że jestem za późno. Ale mam ten sam problem. PO wyraźnie wspomniał, że dał everyonepełną kontrolę. Jeśli przyznamy everyonepełną kontrolę, to nawet wtedy musimy udzielić dostępu DefaultAppPool? To zagmatwane.
qurban
3
@stom - oczywiście nie jest to najlepsza praktyka. Otwierasz witrynę na wszelkiego rodzaju luki. Potrzebujesz tylko uprawnień do odczytu / zapisu w Imageskatalogu dla użytkownika / tożsamości, na którym działa strona internetowa (musisz zapytać o to swojego dostawcę hosta).
Oded
223

Odmowa dostępu do ścieżki „C: \ inetpub \ wwwroot \ mysite \ images \ savehere”

Przeczytaj uważnie wiadomość. Próbujesz zapisać do pliku, który ma taką samą nazwę jak katalog. To nie może zadziałać, nie możesz zastąpić katalogu wypełnionego plikami jednym nowym plikiem. To spowodowałoby niemożliwą do zdiagnozowania utratę danych. „Odmowa dostępu do ścieżki” to system plików walczący, aby temu zapobiec.

Komunikat o wyjątku nie jest idealny, ale pochodzi prosto z systemu operacyjnego i jest odlany w kamieniu. Framework często dodaje dodatkowe kontrole w celu generowania lepszych komunikatów, ale jest to kosztowny test w sieci. Perf to także funkcja.

Musisz użyć nazwy takiej jak „C: \ inetpub \ wwwroot \ mysite \ images \ savehere \ mumble.jpg”. Rozważ metodę Path.Combine (), aby niezawodnie wygenerować nazwę ścieżki.

Hans Passant
źródło
19
@ Hans Passant Dziękuję za nieco surowe oświadczenie. To sprawiło, że zajrzałem do swojego kodu i zdałem sobie sprawę, że popełniłem ten sam błąd.
LosManos
dla mnie problem polegał na tym, że plik istniał i użytkownik nie mógł go zastąpić
VinnyG
Ha! Zrobiłem dokładnie to samo.
jakejgordon
Może ten wątek powinien zostać zablokowany, aby chronić przed „Ja też!” odpowiedzi. Ponieważ ja też! W moim przypadku powinienem dodać, że denerwuje mnie fakt, że metoda SaveAs obiektu HttpPostedFileBase wymagała nazwy oprócz ścieżki, biorąc pod uwagę, że nazwa jest kolejną właściwością obiektu. Oczywiście myślę, że w ten sposób możesz nadać mu inną nazwę.
Ralph
1
Wystąpił ten błąd podczas próby napisania pliku w teście jednostkowym (nie ma to nic wspólnego z usługami IIS ani z czymkolwiek związanym z siecią), a komunikat o błędzie jest tak niejasny. Dlaczego nie pojawia się coś między wierszami „Nie można otworzyć \ ścieżka \ do \ pliku jako pliku”?
MarioDS
22

Miałem ten sam problem podczas próby utworzenia pliku na serwerze (właściwie jest to plik będący kopią z szablonu).

Oto pełny komunikat o błędzie:

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

Dodałem nowy folder o nazwie Templateswewnątrz folderu aplikacji IIS. Jedną bardzo ważną rzeczą w moim przypadku jest to, że musiałem przyznać uprawnienia do zapisu (Gravar) użytkownikowi IUSR w tym folderze. Być może trzeba dać Network Servicei ASP.NET v$.#samo pozwolenie pisać.

wprowadź opis obrazu tutaj

Po wykonaniu tej czynności wszystko działa zgodnie z oczekiwaniami.

Leniel Maccaferri
źródło
12

Miałem dokładnie ten sam problem.

Rozwiązaniem było to, że plik, do którego próbowałem uzyskać dostęp, był tylko do odczytu , ponieważ został skopiowany z pliku szablonu, który był tylko do odczytu.

<facepalm />

Ruskin
źródło
Altova AltovaXML Application Class (DCOM) robi to. Sprawiał mi problemy.
Mike D
Mam na myśli, że musi używać czegoś podobnego do następującego wiersza, co oznacza, że ​​XSLT nie może być tylko do odczytu. 'FileStream ms = new FileStream (path, FileMode.Open, FileAccess.ReadWrite);'
Mike D
1
Oto również <facepalm /> ode mnie. Aha i ... Dzięki, tylko do odczytu też był mój problem.
Cătălin Rădoi
7

Mam ten problem, gdy próbuję zapisać plik bez ustawiania nazwy pliku.

Stary kod

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

Kodeks roboczy

File.WriteAllBytes(@"E:\Folder\"+ fileName, Convert.FromBase64String(Base64String));
MarceloBarbosa
źródło
6

Mój problem polegał na tym, że musiałem poprosić o dostęp tylko do odczytu:

FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);
jesal
źródło
1
Bingo - to też mnie ugryzło! Dziękuję za wiadomość!
paulsm4
4

Jaka jest Twoja pula aplikacji dla aplikacji sieci Web działającej jako, aby rozwiązać problem, spróbuj utworzyć nową pulę aplikacji z, powiedzmy, usługą sieciową jako tożsamością, i spraw, aby aplikacja internetowa korzystała z nowej utworzonej puli aplikacji i sprawdź, czy błąd nadal występuje.

Ta01
źródło
4

Poniższa wskazówka nie jest odpowiedzią na pierwotne pytanie tego wątku, ale może pomóc niektórym innym użytkownikom, którzy trafią na tę stronę, po popełnieniu tego samego głupiego błędu, który właśnie zrobiłem ...

Próbowałem uzyskać kontrolę ASP.Net FileUpload w celu przesłania pliku na adres sieciowy, który zawiera „ ukryty udział ”, a mianowicie:

\ MyNetworkServer \ c $ \ SomeDirectoryOrOther

Nie rozumiem tego. Gdybym uruchomił stronę internetową w trybie debugowania w programie Visual Studio, działałoby dobrze. Ale kiedy projekt został wdrożony i działał przez użytkownika puli aplikacji, odmówił znalezienia tego katalogu sieciowego.

Sprawdziłem, pod jakim użytkownikiem działa moja witryna IIS, przyznałem temu użytkownikowi pełne uprawnienia do tego katalogu na serwerze „ MyNetworkServer ” itd. Itd., Ale nic nie działało.

Powodem (oczywiście!) Jest to, że tylko administratorzy mogą „zobaczyć” te ukryte udziały na dysku.

Moim rozwiązaniem było po prostu utworzenie „normalnego” udziału dla

\ MyNetworkServer \ SomeDirectoryOrOther

i dzięki temu usunięto błąd „Odmowa dostępu do ścieżki…”. FileUpload mógł pomyślnie uruchomić polecenie

fileUpload.SaveAs(networkFilename);

Mam nadzieję, że pomoże to innym użytkownikom, którzy popełniają ten sam błąd, co ja!

Zwróć również uwagę, że jeśli przesyłasz duże pliki (ponad 4 MB), IIS7 wymaga zmodyfikowania pliku web.config w dwóch miejscach. Kliknij to łącze, aby przeczytać, co musisz zrobić: Przesyłanie dużych plików w ASP.Net

Mike Gledhill
źródło
4

dodaj uprawnienia pełnej kontroli IIS_IUSERS do swojego folderu. tę opcję znajdziesz na karcie bezpieczeństwa we właściwościach folderu. znajdź tę opcję i użytkownika na tym obrazku

Ali Rasouli
źródło
Zła rada. Arbitralne oddanie IIS_USERS "pełnej kontroli" - bez dokładnego rozważenia - jest moralnym odpowiednikiem powiedzenia "Pielęgniarka - piła łańcuchowa";)
paulsm4
4

Rozwiązałem z tym ustawieniem:

IIS> Pule aplikacji> [Twoja witryna]> Ustawienia zaawansowane ...> Tożsamość> Wbudowane konto> System lokalny

Mohammad Hossein Ganjyar
źródło
2
To daje uprawnienia LocalAdmin Twojej witrynie. Jest to kwestia bezpieczeństwa.
Rich-Lang
1
NIGDY nie uruchamiaj swojej witryny na koncie LocalSystem. ZAWSZE. KROPKA.
Mihail Shishkov
@MihailShishkov why?
Mohammad Hossein Ganjyar,
2
@MohammadHosseinGanjyar LocalSystem ma uprawnienia administratora w systemie. Uruchamiając witrynę na tym koncie, w zasadzie dajesz jej klucze do całego systemu i prawdopodobnie całej sieci lokalnej, w której znajduje się serwer. Oznacza to, że jeśli atakujący znajdzie sposób na wykorzystanie Twojej witryny - witryna i cały system są zepsute. Właśnie dlatego przywileje / prawa i konta istnieją w pierwszej kolejności. Z zasady pamiętaj o tym - żadne oprogramowanie nie powinno działać z większymi uprawnieniami niż musi wykonywać swoją pracę. Na przykład witryna blogu nie potrzebuje prawa do formatowania D: drive
Mihail Shishkov
2

Mój problem był taki:

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

ale zamiast używać ścieżki, powinienem użyć File.FullName ... Nie wiem, czy to pomoże komukolwiek innemu, po prostu przekazując własne doświadczenia z tym błędem!

Tarcísio Luna
źródło
2
  1. Zmień ustawienie z konta wbudowanego na konto niestandardowe i wprowadź nazwę użytkownika i hasło drugiego serwera.

  2. Zachowaj ustawienie jako zintegrowane (zamiast trybu klasycznego).

uday
źródło
1

Może to ci pomoże.

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

Zapisz w tym miejscu katalog wirtualny i nadaj uprawnienia do odczytu / zapisu z panelu sterowania

Harsh Baid
źródło
Uruchom InetMgr.exe, a następnie przejdź do folderu savetutaj pod mysite (aplikacja internetowa / witryna internetowa w IIS), będzie po lewej stronie, gdzie znajduje się DefaultApp, mam nadzieję, że
wiesz, co
0

Miałem katalog o tej samej nazwie co plik, który próbowałem napisać, więc ludzie też mogą go znaleźć.

Samuel
źródło
0

Napotkałem ten problem podczas programowania na mojej lokalnej stacji roboczej.

Po kilku nieudanych iisresetwywołaniach naprawiłem tę sytuację, ponownie uruchamiając komputer.

Z perspektywy czasu problem mógł powodować otwarty uchwyt pliku.

Jim G.
źródło
0

W moim przypadku musiałem dodać regułę autoryzacji .NET dla witryny sieci Web w usługach IIS.

Dodałem regułę zezwalającą na anonimowych użytkowników.

Reguły autoryzacji .NET

GerardBeckerleg
źródło
0

Miałem ten sam problem, ale naprawiłem go, zapisując plik w innej lokalizacji, a następnie kopiując plik i wklejając go w miejscu, w którym chciałem, aby był. Skorzystałem z opcji zastąpienia istniejącego pliku i to załatwiło sprawę. Wiem, że to nie jest najbardziej efektywny sposób, ale działa i zajmuje mniej niż 15 sekund.

Samuel Nde
źródło
0

Miałem z tym wiele problemów, szczególnie związanych z moim kodem działającym lokalnie, ale kiedy musiałem go uruchomić w usługach IIS, zgłaszał ten błąd. Okazało się, że dodanie czeku do mojego kodu i zezwolenie aplikacji na utworzenie folderu przy pierwszym uruchomieniu rozwiązało problem bez konieczności majstrowania przy autoryzacjach folderów.

coś takiego, zanim wywołasz swoją metodę, która używa folderu

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

        if (!exists)
            System.IO.Directory.CreateDirectory("mypath");
AtLeastTheresToast
źródło
0

Jeśli pojawi się ten błąd podczas przesyłania plików w subdomenie i działa poprawnie w Twojej localhost, wykonaj poniższe czynności:

Rozwiązanie:

Panel Plesk

  • Zaloguj się do swojego Panelu Plesk. Wybierz swoją domenę podrzędną, która powoduje błąd.
  • Kliknij Ustawienia hostingu .
  • Wybierz Dodatkowe uprawnienia do zapisu / modyfikacji i Zastosuj.

CPanel

  • Nie jestem pewien co do opcji dostępnych w CPanel. Ale JEŚLI dasz pozwolenie na katalog (w CPanel musi to być liczba dziesiętna, taka jak 777, 755), rozwiąże problem.

Więcej informacji można znaleźć tutaj

Przyczyna błędu:

  • Załóżmy, że FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*))będzie to Twój kod do przenoszenia plików do ścieżki przesyłania.
  • Server.MapPathpoda fizyczną ścieżkę (rzeczywistą ścieżkę) katalogu. Jednak Twoja domena podrzędna może nie mieć pozwolenia na dostęp do ścieżki fizycznej.

  • Tak więc, jeśli udzielisz subdomenie pozwolenia na dostęp do zapisu / modyfikacji, rozwiąże to problem.

Guruprasad Bhat
źródło
0

Możesz spróbować sprawdzić, czy właściwości sieci Web projektu nie przełączyły się na IIS Express i zmienić je z powrotem na IIS Local

AMykowski
źródło
0

Upewnij się, że twój cel System.IO.Delete(string file)jest plikiem, który istnieje. Może w twoim kodzie jest błąd; na przykład nie przekazujesz poprawnej nazwy pliku do metody lub twoim celem jest folder. W takich przypadkach zobaczysz komunikat: „Odmowa dostępu do ścieżki, błąd”.

Mohammad Yoosefiyan
źródło
-1

Stworzyłem wirtualny katalog z pełną zgodą i dodałem tam źródło ffmpeg i pliki wideo, więc w końcu miało to sens, ponieważ każdy może mieć do niego dostęp.

Kamila
źródło