2011-03-13 5 views
6

He escrito un método en mi controlador que genera automáticamente un mazo de PowerPoint para mi cliente y todo funciona bien ... excepto que estoy atascado en la parte sobre guardar el archivo en el disco.¿Por qué sigo obteniendo "Acceso a la ruta 'C: ... ...' denegado" incluso después de otorgar permiso de escritura IIS_IUSRS en el directorio?

No soy ajeno a este concepto; y "pensé" que todo lo que tenía que hacer era otorgar permiso de escritura IIS_IUSRS en el directorio y leer el permiso en todos los directorios principales. Estoy usando IIS 7, y he hecho esto antes con IIS 6 otorgando a NETWORK SERVICE los mismos permisos.

Solo por dar patadas, incluso le di a TODOS los permisos de escritura en el directorio y sigo recibiendo la Excepción: System.UnauthorizedAccessException: Acceso denegado a la ruta 'C: ...... \ Content \ PPT'. (Eliminé parte del camino por simplicidad).

¿Hay algo más que esté pasando por alto? El servidor en el que está es el primero que configuré, así que es posible que haya pasado por alto algo.

Aquí está mi método de control simplificado:

public ActionResult CreatePowerPoint() 
    { 
     string path = HttpContext.Server.MapPath("~/Content/PPT"); 

     Aspose.Slides.Presentation presentation = new Aspose.Slides.Presentation(); 
     CreatePresentation(presentation); 

     presentation.Save(path, Aspose.Slides.Export.SaveFormat.Ppt); 

     return View(); 
    } 
} 

el método presentation.Save() toma un camino y un formato para guardar ... No sé qué más para intentar ... ¿Hay algo malo con mi código? ¿Estoy creando el camino incorrectamente? También puedo pasar una corriente de Stream en el método de guardar, pero no estoy seguro si eso solucionará el problema.

+1

La parte de la ruta que decidió omitir por conveniencia puede hacer la diferencia. Debe mostrar en qué árbol del directorio está intentando guardar el archivo; Windows en algunas versiones no permite a usuarios no administrativos escribir en algunas carpetas como parte de UAC. "No puedo guardar en este directorio" sin mostrar el directorio hace que la pregunta no tenga respuesta. –

+1

O puede intentar suplantar a un Usuario en lugar de darle a IIS_IUSERS o a TODOS los permisos. Creo que no se permite el acceso a todas las carpetas de usuarios no administrativos y eso crea problemas. El camino correcto es la suplantación. – Tayyab

+0

Agradezco la ayuda.Encontré la solución que publiqué en mi propia respuesta. Gracias también Ken, porque la ruta era correcta, pero también necesitaba tener el nombre del archivo agregado al final de la ruta. – Ben

Respuesta

18

Encontré la solución - Estoy usando IIS 7, y tenía el grupo de aplicaciones configurado con la identidad incorrecta. En IIS 7, simplemente cambié la identidad del grupo de aplicaciones en el que se ejecuta mi aplicación y el boom, todo funcionó. Utilicé NETWORK SERVICE como mi identidad.

También para aquellos que usan Aspose Slides, también tuve que asegurarme de que el nombre del archivo estuviera en la ruta.

+0

¡Gracias! Estuve atrapado en eso durante las últimas tres horas hasta que leí tu publicación. – GrandMasterFlush

+0

¿SERVICIO DE RED o Servicio de red en la configuración avanzada del conjunto de aplicaciones IIS? – guiomie

3

La identidad del grupo de aplicaciones debe establecerse en "Servicio de red" (como un ejemplo de un usuario válido que puede usar para ejecutar el servicio). Pero también debe establecer en Autenticación de administración de IIS \ Autenticación anónima habilitada e Identidad de usuario anónimo a "Identidad de grupo de aplicaciones". Sin esto, todavía recibía excepciones de acceso denegado en la carga de archivos.

3

Me encontré con este problema, pero fue realmente porque los archivos estaban marcados como de solo lectura en el NTFS FS.

En mi caso, era un new FileStream(path, FileMode.Open) que estaba fallando, y se corrigió fácilmente mediante su sustitución por File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read).

En pocas palabras, incluso si el archivo es legible, solo especificar el FileMode.Open parece estar predeterminado en FileAccess.ReadWrite.

0

Estaba teniendo el mismo problema, el problema era que no lo hice eliminar la casilla de verificación de solo lectura en las propiedades de la carpeta determinada.

Cuestiones relacionadas