Acceso a la ruta denegado

164

Sé que esta pregunta se hizo muchas veces aquí, pero no puedo encontrar una solución a mi problema. Estoy tratando de guardar la imagen en la carpeta en .net c # pero obtengo esta excepción:

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)

Le di el control total a esta carpeta (guardar aquí) network servicee iis_iusrs, incluso le di el control total, everyonepero aún obtengo esta excepción. Traté de dar acceso a través del explorador y el administrador de IIS, todavía no tuve suerte

Lo estoy haciendo en Windows Server 2008 R2 e IIS 7.5, ¿a quién necesito para dar acceso?

Gracias

Burjua
fuente
¿Has intentado usar una ruta relativa a tu aplicación? No sé mucho sobre el servidor de Windows, pero puede ser que no permita el acceso a una ruta raíz `C:`.
Michael K
1
Lectores futuros: verifique los permisos en el archivo.
Ruskin

Respuestas:

94

Debe averiguar en el grupo de aplicaciones del sitio web cuál es la identidad con la que se ejecuta (de forma predeterminada, esto es Application Pool Identity) y otorgarle los permisos correctos.

Oded
fuente
Ok, gracias, tengo 5 grupos, todos tienen identidad como ApplicationPoolIdentity, ¿cómo le doy permisos?
Burjua
22
@Burjua: busca al IIS APPPOOL\DefaultAppPoolusuario. Ver este artículo en el sitio oficial de IIS: learn.iis.net/page.aspx/624/application-pool-identities
Oded
1
Ok, como está escrito en este artículo, agregué DefaultAppPooly le di full controlpermisos, pero aún
obtengo
2
Sé que llego demasiado tarde. Pero estoy enfrentando el mismo problema. El OP había mencionado claramente que le había dado everyoneel control total. Si otorgamos everyoneel control total, ¿incluso entonces debemos otorgar acceso a DefaultAppPool? Es confuso.
qurban
3
@stom, por supuesto, no es la mejor práctica. Está abriendo el sitio web a todo tipo de vulnerabilidades. Solo desea permisos de lectura / escritura en el Imagesdirectorio para el usuario / identidad que ejecuta el sitio web (deberá preguntarle a su proveedor de host sobre eso).
Oded
223

Se deniega el acceso a la ruta 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere'

Lee el mensaje cuidadosamente. Está intentando guardar en un archivo que tiene el mismo nombre que el directorio. Eso no puede funcionar, no puede sobrescribir un directorio lleno de archivos con un solo archivo nuevo. Eso causaría una pérdida de datos no diagnosticable, "El acceso a la ruta está denegado" es el sistema de archivos que lucha para evitar que eso suceda.

El mensaje de excepción no es ideal, pero viene directamente del sistema operativo y están hechos en piedra. El marco a menudo agrega controles adicionales para generar mejores mensajes, pero esta es una prueba costosa en una red. Perf también es una característica.

Debe usar un nombre como 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere \ mumble.jpg'. Considere Path.Combine () para generar de manera confiable el nombre de la ruta.

Hans Passant
fuente
19
@Hans Passant Gracias por tu, un poco dura, declaración. Eso me hizo mirar mi código y darme cuenta de que había cometido el mismo error.
LosManos
para mí, el problema era que el archivo existía y el usuario no podía reemplazarlo
VinnyG
Ja! Hice exactamente lo mismo.
jakejgordon
Tal vez este hilo debería estar bloqueado para proteger contra "¡Yo también!" respuestas ¡Porque yo también! En mi caso, debo agregar que me molesta que el método SaveAs de un objeto HttpPostedFileBase requiera un nombre además de la ruta, considerando que el nombre es otra propiedad del objeto. Por supuesto, supongo que podría darle un nombre diferente de esta manera.
Ralph
1
Recibí este error al intentar escribir un archivo en una prueba unitaria (nada que ver con IIS ni nada relacionado con la web), y el mensaje de error es muy vago. ¿Por qué no dice algo entre las líneas de "No se puede abrir \ ruta \ a \ archivo como un archivo"?
MarioDS
22

Estaba teniendo el mismo problema al intentar crear un archivo en el servidor (en realidad, un archivo que es una copia de una plantilla).

Aquí está el mensaje de error completo:

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

Agregué una nueva carpeta llamada Templatesdentro de la carpeta de la aplicación IIS. Una cosa muy importante en mi caso es que necesitaba otorgar el permiso Write (Gravar) para el usuario IUSR en esa carpeta. También puede ser necesario para dar Network Servicey ASP.NET v$.#el mismo permiso de escritura.

ingrese la descripción de la imagen aquí

Después de hacer esto, todo funciona como se esperaba.

Leniel Maccaferri
fuente
12

Tuve exactamente el mismo problema.

La solución fue que el archivo al que intentaba acceder era de solo lectura , ya que se copió de un archivo de plantilla que era de solo lectura.

<facepalm />

Ruskin
fuente
La clase de aplicación Altova AltovaXML (DCOM) está haciendo esto. Me causó problemas.
Mike D
Con lo que quiero decir, debe estar usando algo similar a la siguiente línea, lo que significa que XSLT no debe ser de solo lectura. 'FileStream ms = nuevo FileStream (ruta, FileMode.Open, FileAccess.ReadWrite);'
Mike D
1
Aquí hay un <facepalm /> de mí también. Ah y ... Gracias, solo lectura fue mi problema también.
Cătălin Rădoi
7

Recibí este problema cuando intento guardar el archivo sin establecer el nombre del archivo.

Código antiguo

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

Código de trabajo

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

Mi problema era que solo tenía que solicitar acceso de lectura:

FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);
jesal
fuente
1
Bingo: ¡este también me mordió a mí! ¡Gracias por el post!
paulsm4
4

¿Cuál es la identidad de su grupo de aplicaciones para la aplicación web que se está ejecutando?

Ta01
fuente
4

El siguiente consejo no es una respuesta a la pregunta original de este hilo, pero podría ayudar a otros usuarios que terminan en esta página web, después de cometer el mismo estúpido error que acabo de cometer ...

Intentaba obtener un control ASP.Net FileUpload para cargar su archivo a una dirección de red que contenía un "recurso compartido oculto ", a saber:

\ MyNetworkServer \ c $ \ SomeDirectoryOrOther

No lo entendi. Si ejecutara la página web en modo de depuración en Visual Studio, funcionaría bien. Pero cuando el proyecto se implementó y se ejecutó a través de un usuario del grupo de aplicaciones, se negó a encontrar este directorio de red.

Verifiqué bajo qué usuario se estaba ejecutando mi sitio IIS, le di a este usuario permisos completos para este directorio en el servidor " MyNetworkServer ", etc., pero nada funcionó.

La razón (¡por supuesto!) Es que solo los administradores pueden "ver" estos recursos compartidos ocultos.

Mi solución fue simplemente crear un recurso compartido "normal" para

\ MyNetworkServer \ SomeDirectoryOrOther

y esto eliminó el error "Acceso a la ruta ... denegado". FileUpload pudo ejecutar con éxito el comando

fileUpload.SaveAs(networkFilename);

¡Espero que esto ayude a otros usuarios que cometen el mismo error que yo!

Tenga en cuenta también que si está cargando archivos grandes (más de 4Mb), IIS7 requiere que modifique el archivo web.config en dos lugares. Haga clic en este enlace para leer lo que debe hacer: cargar archivos grandes en ASP.Net

Mike Gledhill
fuente
4

agregue el permiso de control total IIS_IUSERS a su carpeta. encontrará esta opción en la pestaña de seguridad en las propiedades de la carpeta. encuentra esta opción y el usuario en esta imagen

Ali Rasouli
fuente
Mal consejo. Dar arbitrariamente a IIS_USERS "control total", sin una cuidadosa consideración, es el equivalente moral de decir "Enfermera - motosierra";)
paulsm4
4

Resolví con esta configuración:

IIS> Grupos de aplicaciones> [su sitio]> Configuración avanzada ...> Identidad> Cuenta integrada> LocalSystem

Mohammad Hossein Ganjyar
fuente
2
Esto le está dando a su sitio web permisos LocalAdmin. Este es un problema de seguridad.
Rich-Lang
1
NUNCA ejecute su sitio web con la cuenta LocalSystem. NUNCA. PERÍODO.
Mihail Shishkov
@MihailShishkov ¿por qué?
Mohammad Hossein Ganjyar
2
@MohammadHosseinGanjyar LocalSystem tiene derechos de administrador sobre el sistema. Al ejecutar el sitio web con esa cuenta, básicamente le da las claves de todo el sistema y probablemente de toda la red local en la que reside el servidor. Esto significa que si un atacante encuentra una manera de explotar su sitio web, el sitio web y todo el sistema están jodidos. Esa es la razón por la cual existen privilegios / derechos y cuentas en primer lugar. Como regla general, recuerde esto: ningún software debe ejecutarse con mayores privilegios de los que necesita para hacer su trabajo. Por ejemplo, el sitio de blog no necesita el derecho de formatear D: unidad
Mihail Shishkov
2

Mi problema era algo así:

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

pero en lugar de usar la ruta, debería usar File.FullName ... No sé si va a ayudar a alguien más, ¡solo paso mi propia experiencia con este error!

Tarcísio Luna
fuente
2
  1. Cambie la configuración de la cuenta integrada a la cuenta personalizada e ingrese el nombre de usuario y la contraseña del otro servidor.

  2. Mantenga la configuración como integrada (en lugar de modo clásico).

uday
fuente
1

Quizás te ayude.

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

Haga que el Directorio guarde aquí para que sea un directorio virtual y otorgue permisos de lectura / escritura desde el panel de control

Harid Baid
fuente
Ejecute InetMgr.exe y luego vaya a su carpeta savehere debajo de mysite (aplicación web / sitio web en IIS), estará en el lado izquierdo donde se encuentra DefaultApp, espero que lo esté diciendo
Harsh Baid
0

Tenía un directorio con el mismo nombre que el archivo que estaba tratando de escribir, por lo que la gente también puede buscarlo.

Samuel
fuente
0

Encontré este problema mientras desarrollaba en mi estación de trabajo local.

Después de varias iisresetinvocaciones fallidas , remedié esta situación reiniciando mi máquina.

En retrospectiva, un identificador de archivo abierto puede haber estado causando problemas.

Jim G.
fuente
0

En mi caso, tuve que agregar una regla de autorización .NET para el sitio web en IIS.

Agregué una regla para permitir usuarios anónimos.

Reglas de autorización de .NET

GerardBeckerleg
fuente
0

Tuve el mismo problema, pero lo solucioné guardando el archivo en una ubicación diferente y luego copiando el archivo y pegándolo en la ubicación donde quería que estuviera. Utilicé la opción para reemplazar el archivo existente y eso me sirvió. Sé que esta no es la forma más eficiente, pero funciona y lleva menos de 15 segundos.

Samuel Nde
fuente
0

Tuve muchos problemas con esto, específicamente relacionado con mi código que se ejecuta localmente, pero cuando necesitaba ejecutarlo en IIS estaba arrojando este error. Descubrí que agregar un cheque a mi código y dejar que la aplicación creara la carpeta en la primera ejecución solucionó el problema sin tener que meterse con las autorizaciones de las carpetas.

algo así antes de llamar a su método que usa la carpeta

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

        if (!exists)
            System.IO.Directory.CreateDirectory("mypath");
Por lo menos, hay tostadas
fuente
0

Si recibe este error al cargar archivos en Subdominio y funciona correctamente en su localhost, siga los pasos a continuación:

Solución:

Panel Plesk

  • Inicie sesión en su Panel Plesk. Seleccione su subdominio que está dando error.
  • Haga clic en Configuración de alojamiento .
  • Seleccione Permisos adicionales de escritura / modificación y Aplicar.

CPanel

  • No estoy seguro de las opciones disponibles en CPanel. Pero si le das permiso al directorio (en CPanel tiene que ser un número decimal como 777, 755) resolverá el error.

Para más detalles consulte aquí

Motivo del error:

  • Supongamos FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*))que será su código para mover sus archivos a la ruta de carga.
  • Server.MapPathle dará la ruta física (Real Path) del directorio. Pero su Subdominio puede no tener permiso para acceder a la ruta física.

  • Por lo tanto, si otorga permiso para que el subdominio acceda a permisos de escritura / modificación, se resolverá el problema.

Guruprasad Bhat
fuente
0

Puede intentar verificar si sus propiedades web para el proyecto no cambiaron a IIS Express y volver a cambiarlo a IIS Local

AMykowski
fuente
0

Asegúrese de que su objetivo en System.IO.Delete(string file)es un archivo que existe. Tal vez hay un error en su código; al igual que no pasa el nombre de archivo correcto al método, o su destino es una carpeta. En estos casos verá: "error de acceso a la ruta denegado".

Mohammad Yoosefiyan
fuente
-1

Creé un directorio virtual con permiso completo y agregué la fuente ffmpeg y los archivos de video allí, por lo que finalmente tuvo sentido, ya que cualquiera puede acceder a él.

Kamila
fuente