Pregunta

He creado una colección de sitios dentro de una aplicación web con el usuario A como administrador de la colección de sitios. He agregado un enlace en la página de características del sitio. Al hacer clic en ese enlace, intento crear un trabajo de temporizador. A continuación, se ejecuta el código al hacer clic en el enlace

//Allow unsafe updates.
 SPContext.Current.Web.AllowUnsafeUpdates = true;

//Get current web application.
SPWebApplication webApp = SPContext.Current.Site.WebApplication;

// Create new job.
ArchiveJob automaticArchiveJob = new ArchiveJob(scheduleDetails.scheduleName, webApp);

SPHourlySchedule hourlySchedule = new SPHourlySchedule();
hourlySchedule.BeginMinute = 0;
hourlySchedule.EndMinute = 1;
automaticArchiveJob.Schedule = hourlySchedule;

//Finally update archival job.
automaticArchiveJob.Update();

Ahora, cuando inicié sesión con el usuario A y hago clic en ese enlace en la página de 'configuración del sitio', obtengo una excepción de seguridad con el mensaje '' Acceso denegado '' en la línea automaticArchiveJob.Update () . Pero si inicié sesión con el usuario administrador (también inicié sesión en la máquina con este usuario) y hago clic en el enlace, se crea el trabajo con éxito. También hice que el usuario A sea miembro del grupo WSS_ADMIN_WPG pero sigo teniendo el mismo problema. ¿Hay algo más que deba hacer para resolver el problema?

¿Fue útil?

Solución

El " Acceso denegado " es el comportamiento esperado dado lo que intentas hacer. Permíteme explicarte.

Cuando se crea una instancia de trabajo del temporizador, se conserva en la base de datos de configuración de la granja. Acceder a esta base de datos con fines de escritura es una operación privilegiada; como regla general, solo la cuenta de servicio de la granja (es decir, la cuenta bajo la cual se ejecuta OWSTIMER.EXE) o las cuentas que tienen explícitamente los derechos necesarios para llevar a cabo dicha operación en la base de datos de configuración (generalmente administradores) tendrán éxito.

De manera predeterminada, el intento de crear una instancia de un trabajo del temporizador desde el contexto de la colección de sitios fallará. Intentar la operación en un bloque de privilegios elevados (a través de SPSecurity.RunWithElevatedPrivileges) solo dará como resultado que se use el contexto de la cuenta del grupo de aplicaciones de la aplicación web en lugar del contexto del usuario actual; esto solo tiene éxito si la cuenta del grupo de aplicaciones tiene derechos para escribir en la base de datos de configuración de la granja. Si esto sucede, generalmente se debe a que (a) la cuenta del servicio de granja se está utilizando en roles en los que no debería estar (para ejecutar aplicaciones web de contenido, por ejemplo), o (b) se han otorgado permisos adicionales al grupo de aplicaciones cuenta. Ambos casos representan una desviación de un modelo operativo de mejores prácticas.

Las instancias de trabajo del temporizador generalmente se crean en el momento de activación de la característica en las características con alcance en el nivel de granja o aplicación web. ¿Por qué? Debido a que esas características normalmente son activadas por los administradores desde la línea de comando (suponiendo que el administrador también tenga derechos en la base de datos de configuración de la granja) o desde dentro de la Administración central (donde la activación ocurre a través de la cuenta de servicio de la granja, garantizado que tiene derechos sobre la base de datos de configuración ) Cuando la función se activa y se llama al método FeatureActivated de SPFeatureReceiver, es seguro (desde una perspectiva de seguridad) configurar el trabajo del temporizador.

Resolver su problema particular adecuadamente implicará darle un vuelco al problema. En lugar de tratar de crear una instancia del trabajo del temporizador desde la colección de sitios a pedido, recomiendo configurar el equivalente de un "barrido". temporizador de trabajo en el momento en que se activa su función. Es cierto que esto requiere más planificación y esfuerzo de lo que está tratando de hacer, pero su ruta actual solo funcionará si la seguridad se ajusta de alguna manera, y eso no se recomienda.

Cuando estaba armando mi característica de vaciado de granja de caché BLOB ( http://blobcachefarmflush.codeplex.com ) , Tuve que hacer lo mismo yo mismo. Puede ver los detalles de cómo trabajé a través de la creación de trabajos del temporizador en la clase FeatureReceiver (BlobCacheFarmFlushSweepJobFeatureReceiver). El resto del código y la documentación asociada también pueden ayudar con algunos de los otros desafíos que se presentan.

Siéntase libre de usar lo que encuentre de cualquier manera; ¡por eso está ahí!

Espero que eso ayude. Si hay preguntas de seguimiento, dispare y responderé lo mejor que pueda :-)

Otros consejos

Intente anular el método SPPersistedObject.HasAdditionalUpdateAccess () y devuelva true.

protegido anular bool HasAdditionalUpdateAccess () {   volver verdadero; }

He usado RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges (delegado () { });

Funciona para mí ... ¿Alguien tiene otra solución? Si es así, házmelo saber.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top