L'accesso al percorso è negato


164

So che questa domanda è stata posta molte volte qui, ma non riesco a trovare una soluzione al mio problema. Sto provando a salvare l'immagine nella cartella in .net c # ma ottengo questa eccezione:

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)

Ho dato il pieno controllo a questa cartella (savehere) a , network servicee ho iis_iusrsanche dato il pieno controllo everyonema ottenendo ancora questa eccezione. Ho provato a dare l'accesso tramite Explorer e tramite il gestore IIS, ancora senza fortuna

Lo sto facendo su Windows Server 2008 R2 e IIS 7.5, a chi devo dare accesso?

Grazie


Hai provato a utilizzare un percorso relativo alla tua applicazione? Non so molto sul server Windows, ma può darsi che non consenta l'accesso a un percorso root `C:`.
Michael K,

1
Lettori futuri: controlla le autorizzazioni sul file.
Ruskin,

Risposte:


94

È necessario scoprire dal pool di applicazioni per il sito Web qual è l'identità in esecuzione (per impostazione predefinita è Application Pool Identity) e concedere le autorizzazioni corrette.


Ok, grazie, ho 5 pool, tutti hanno identità come ApplicationPoolIdentity, come posso dare i permessi ad esso?
Burjua,

22
@Burjua - cerca l' IIS APPPOOL\DefaultAppPoolutente. Vedi questo articolo sul sito IIS ufficiale: learn.iis.net/page.aspx/624/application-pool-identities
Oded,

1
Ok, come scritto in questo articolo ho aggiunto DefaultAppPoole dato le full controlautorizzazioni ad esso, ma ricevendo ancora lo stesso errore
Burjua

2
So di essere troppo tardi. Ma sto affrontando lo stesso problema. L'OP aveva chiaramente affermato di aver dato everyoneil pieno controllo. Se garantiamo everyoneil pieno controllo, anche allora dobbiamo concedere l'accesso a DefaultAppPool? È confusionario.
qurban,

3
@stom - ovviamente non è la migliore pratica. Stai aprendo il sito Web a tutti i tipi di vulnerabilità. Desideri solo autorizzazioni di lettura / scrittura per la Imagesdirectory per l'utente / identità che esegue il sito Web (dovrai chiedere al tuo provider host).
Oded,

223

L'accesso al percorso 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere' è negato

Leggi attentamente il messaggio. Stai tentando di salvare in un file con lo stesso nome della directory. Non può funzionare, non è possibile sovrascrivere una directory piena di file con un singolo nuovo file. Ciò causerebbe una perdita non riconoscibile di dati, "L'accesso al percorso è negato" è il file system che reagisce per impedire che ciò accada.

Il messaggio di eccezione non è l'ideale, ma proviene direttamente dal sistema operativo e sono espressi in pietra. Il framework spesso aggiunge controlli extra per generare messaggi migliori, ma questo è un test costoso su una rete. Perf è anche una caratteristica.

Devi usare un nome come 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere \ mumble.jpg'. Considerare Path.Combine () per generare in modo affidabile il nome del percorso.


19
@Hans Passant Grazie per la tua affermazione un po 'dura. Questo mi ha fatto esaminare il mio codice rendendomi conto che avevo fatto lo stesso errore.
LosManos,

per me il problema era che il file esisteva e l'utente non poteva sostituirlo
VinnyG,

Hah! Ho fatto esattamente la stessa cosa.
jakejgordon,

Forse questa discussione dovrebbe essere bloccata per proteggersi da "Anch'io!" risposte. Perché anche io! Nel mio caso dovrei aggiungere che sono infastidito dal fatto che il metodo SaveAs di un oggetto HttpPostedFileBase richieda un nome oltre al percorso, considerando che il nome è un'altra proprietà sull'oggetto. Ovviamente credo che potresti dargli un nome diverso in questo modo.
Ralph

1
Ho riscontrato questo errore durante il tentativo di scrivere un file in un test unitario (nulla a che fare con IIS o qualsiasi cosa relativa al Web) e il messaggio di errore è così vago. Perché non dice qualcosa tra le righe di "Impossibile aprire \ path \ to \ file come file"?
MarioDS,

22

Stavo avendo lo stesso problema durante il tentativo di creare un file sul server (in realtà un file che è una copia da un modello).

Ecco il messaggio di errore completo:

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

Ho aggiunto una nuova cartella chiamata Templatesall'interno della cartella dell'app IIS. Una cosa molto importante nel mio caso è che dovevo dare l'autorizzazione di scrittura (Gravar) per l'utente IUSR su quella cartella. Potrebbe anche essere necessario concedere Network Servicee ASP.NET v$.#la stessa autorizzazione di scrittura.

inserisci qui la descrizione dell'immagine

Dopo aver fatto tutto, tutto funziona come previsto.


12

Ho avuto esattamente lo stesso problema.

La soluzione era che il file a cui stavo tentando di accedere era di sola lettura , poiché veniva copiato da un file modello di sola lettura.

<facepalm />


L'Altava AltovaXML Application Class (DCOM) lo sta facendo. Mi ha causato problemi.
Mike D,

Voglio dire, deve usare qualcosa di simile alla riga seguente, il che significa che XSLT non deve essere di sola lettura. 'FileStream ms = new FileStream (path, FileMode.Open, FileAccess.ReadWrite);'
Mike D,

1
Ecco anche un <facepalm /> da parte mia. Oh e .. Grazie, di sola lettura è stato anche il mio problema.
Cătălin Rădoi,

7

Ho riscontrato questo problema quando provo a salvare il file senza impostare il nome del file.

Vecchio codice

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

Codice di lavoro

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

6

Il mio problema era che dovevo chiedere solo l'accesso in lettura:

FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);

1
Bingo - anche questo mi ha morso! Grazie per il post!
paulsm4,

4

Quale identità è il tuo pool di applicazioni per l'applicazione Web in esecuzione, per risolvere i problemi, prova a creare un nuovo pool di app con il nome Network Service come identità e fai in modo che la tua applicazione web utilizzi il nuovo pool di app che hai creato e vedi se l'errore persiste.


4

Il seguente suggerimento non è una risposta alla domanda originale di questa discussione, ma potrebbe aiutare alcuni altri utenti che finiscono su questa pagina web, dopo aver fatto lo stesso stupido errore che ho appena fatto ...

Stavo tentando di ottenere un controllo ASP.Net FileUpload per caricare il file su un indirizzo di rete che conteneva una " condivisione nascosta ", ovvero:

\ MyNetworkServer \ c $ \ SomeDirectoryOrOther

Non l'ho capito. Se avessi eseguito la pagina Web in modalità Debug in Visual Studio, avrebbe funzionato bene. Ma quando il progetto è stato distribuito ed era in esecuzione tramite un utente del pool di applicazioni, si è rifiutato di trovare questa directory di rete.

Avevo verificato su quale utente era in esecuzione il mio sito IIS, avevo concesso a questo utente le autorizzazioni complete per questa directory sul server " MyNetworkServer ", ecc. Ecc., Ma non ha funzionato.

Il motivo (ovviamente!) È che solo gli amministratori sono in grado di "vedere" queste condivisioni di unità nascoste.

La mia soluzione era semplicemente quella di creare una condivisione "normale" a

\ MyNetworkServer \ SomeDirectoryOrOther

e questo si è sbarazzato dell'errore "Accesso al percorso ... negato". FileUpload è stato in grado di eseguire correttamente il comando

fileUpload.SaveAs(networkFilename);

Spero che questo aiuti alcuni altri utenti che commettono lo stesso errore che ho fatto!

Nota anche che se stai caricando file di grandi dimensioni (oltre 4 Mb), IIS7 richiede di modificare il file web.config in due punti. Fai clic su questo link per leggere cosa devi fare: caricamento di file di grandi dimensioni in ASP.Net


4

aggiungi l'autorizzazione di controllo completo IIS_IUSERS alla tua cartella. questa opzione è disponibile nella scheda Sicurezza nelle proprietà della cartella. trova questa opzione e l'utente in questa immagine


Cattivo consiglio. Dare arbitrariamente "pieno controllo" a IIS_USERS - senza un'attenta considerazione - è l'equivalente morale di dire "Infermiera - motosega";)
paulsm4

4

Ho risolto con questa impostazione:

IIS> Pool di applicazioni> [il tuo sito]> Impostazioni avanzate ...> Identità> Account integrato> LocalSystem


2
Questo sta dando le autorizzazioni LocalAdmin al tuo sito web. Questa è una preoccupazione per la sicurezza.
Rich-Lang,

1
NON eseguire MAI il tuo sito Web con l'account LocalSystem. MAI. PERIODO.
Mihail Shishkov,

@MihailShishkov perché?
Mohammad Hossein Ganjyar,

2
@MohammadHosseinGanjyar LocalSystem dispone dei diritti di amministratore sul sistema. Eseguendo il sito Web con tale account, gli fornisci le chiavi dell'intero sistema e probabilmente dell'intera rete locale su cui risiede il server. Ciò significa che se un utente malintenzionato trova il modo di sfruttare il tuo sito Web, il sito Web e l'intero sistema vengono rovinati. Questo è il motivo per cui privilegi / diritti e account esistono in primo luogo. Come regola generale, ricordate questo: nessun software dovrebbe funzionare con maggiori privilegi, quindi deve fare il suo lavoro. Ad esempio, il sito blog non ha bisogno del diritto di formattare D: drive
Mihail Shishkov

2

Il mio problema era qualcosa del genere:

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

ma invece di usare il percorso dovrei usare File.FullName ... Non so se sarà d'aiuto a qualcun altro, solo passando la mia esperienza con questo erro dato!


2
  1. Modificare le impostazioni dall'account incorporato all'account personalizzato e immettere il nome utente e la password dell'altro server.

  2. Mantieni l'impostazione come integrata (anziché in modalità classica).


1

Forse ti aiuterà.

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

0

Imposta Salva directory come directory virtuale e dai il permesso di lettura / scrittura dal pannello di controllo


Esegui InetMgr.exe quindi vai alla tua cartella salvandola sotto mysite (applicazione Web / sito Web in IIS) sarà sul lato sinistro dove si trova DefaultApp, spero che te lo dica
Harsh Baid

0

Aveva una directory con lo stesso nome del file che stavo cercando di scrivere, quindi anche le persone possono cercarlo.


0

Ho riscontrato questo problema durante lo sviluppo sulla mia workstation locale.

Dopo diverse iisresetinvocazioni non riuscite , ho risolto questa situazione riavviando la mia macchina.

In retrospettiva, un handle di file aperto potrebbe aver causato problemi.


0

Nel mio caso ho dovuto aggiungere una regola di autorizzazione .NET per il sito Web in IIS.

Ho aggiunto una regola per consentire agli utenti anonimi.

Regole di autorizzazione .NET


0

Ho avuto lo stesso problema ma l'ho risolto salvando il file in una posizione diversa e quindi copiando il file e incollandolo nella posizione in cui volevo che fosse. Ho usato l'opzione per sostituire il file esistente e quello ha fatto il trucco per me. So che questo non è il modo più efficiente ma funziona e richiede meno di 15 secondi.


0

Ho avuto molti problemi con questo, specificamente correlato al mio codice eseguito localmente ma quando avevo bisogno di eseguirlo su IIS stava generando questo errore. Ho scoperto che aggiungendo un segno di spunta al mio codice e lasciando che l'applicazione creasse la cartella alla prima esecuzione, il problema veniva risolto senza dover confondere con le autorizzazioni delle cartelle.

qualcosa del genere prima di chiamare il metodo che utilizza la cartella

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

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

0

Se viene visualizzato questo errore durante il caricamento dei file nel sottodominio e il corretto funzionamento nel proprio localhost, quindi seguire i passaggi seguenti:

Soluzione:

Pannello di Plesk

  • Accedi al tuo pannello Plesk. Seleziona il tuo sottodominio che sta dando errore.
  • Fai clic su Impostazioni di hosting .
  • Seleziona Ulteriori autorizzazioni di scrittura / modifica e Applica.

CPanel

  • Non sono sicuro delle opzioni disponibili in CPanel. Ma se dai il permesso alla directory (in CPanel deve essere un numero decimale come 777, 755) risolverà l'errore.

Per maggiori dettagli consultare qui

Motivo dell'errore:

  • Supponiamo FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*))che sia il tuo codice a spostare i tuoi file nel percorso di caricamento.
  • Server.MapPathti darà il percorso fisico (percorso reale) della directory. Ma il tuo sottodominio potrebbe non disporre dell'autorizzazione per l'accesso al percorso fisico.

  • Pertanto, se si concede l'autorizzazione per il sottodominio ad accedere all'autorizzazione di scrittura / modifica, il problema verrà risolto.


0

Puoi provare a verificare se le tue proprietà web per il progetto non sono passate a IIS Express e cambiarle in IIS Local


0

Assicurati che il tuo target in System.IO.Delete(string file)sia un file esistente. Forse c'è un errore nel tuo codice; come se non passassi il nome file corretto al metodo o la tua destinazione fosse una cartella. In questi casi vedrai: "errore di accesso al percorso negato".


-1

Ho creato una directory virtuale con il permesso completo e ho aggiunto la fonte ffmpeg e i file video lì, quindi alla fine ha avuto senso in quanto può essere accesso a chiunque.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.