sharepoint - Problema al crear un trabajo de temporizador
moss scheduled-tasks (3)
El "acceso denegado" es el comportamiento esperado dado lo que está intentando 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 comunidad. 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 de servidores (es decir, la cuenta bajo la cual se ejecuta OWSTIMER.EXE) o las cuentas que explícitamente tienen los derechos necesarios para llevar a cabo dicha operación en la base de datos de configuración (normalmente administradores) tendrán éxito.
De forma predeterminada, intentar crear una instancia de un trabajo del temporizador dentro del contexto de colección de sitios va a fallar. Intentar la operación en un bloque de privilegios elevado (a través de SPSecurity.RunWithElevatedPrivileges) solo resultará en que se use el contexto de la cuenta del grupo de aplicaciones de la aplicación web en lugar del contexto de 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 comunidad. Si esto sucede, normalmente se debe a que (a) la cuenta de servicio de la granja de servidores está siendo utilizada en roles en los que no debería estar (para ejecutar aplicaciones web de contenido, por ejemplo), o (b) se otorgaron permisos adicionales al grupo de aplicaciones cuenta. Ambos casos representan una desviación del modelo operativo de mejores prácticas.
Las instancias de trabajo del temporizador normalmente se crean en el tiempo de activación de funciones en Funciones con ámbito en el nivel de Granja o de Aplicación Web. ¿Por qué? Debido a que esas características normalmente las activan los administradores desde la línea de comandos (suponiendo que el administrador también tenga derechos en la base de datos de configuración de la comunidad) o desde Administración central (donde la activación ocurre a través de la cuenta de servicio de la granja). ) Cuando se activa la función 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 correctamente implicará dar la vuelta al problema un poco. En lugar de tratar de crear una instancia del trabajo del temporizador dentro de la colección de sitios a pedido, recomiendo configurar el equivalente de un trabajo de temporizador de "barrido" en el momento en que se activa su Función. Es cierto que esto requiere más planificación y esfuerzo de lo que intenta hacer, pero su ruta actual solo funcionará si la seguridad se ajusta de alguna manera, y eso no se recomienda.
Cuando estaba armando mi función BLOB cache farm flush ( http://blobcachefarmflush.codeplex.com ), tuve que hacer casi lo 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 surgen.
Siéntete libre de usar lo que encuentres de cualquier manera; es por eso que está ahí!
Espero que eso ayude. Si hay preguntas de seguimiento, despídete y responderé lo mejor que pueda :-)
Creé una colección de sitios dentro de una aplicación web con el usuario A como administrador de colecciones de sitios. He agregado un enlace en la página de características del sitio. Al hacer clic en ese enlace, estoy tratando de crear un trabajo de temporizador. Debajo está el código ejecutado 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 ''configuración del sitio'', aparece una excepción de seguridad con el mensaje "Acceso denegado" en la línea automaticArchiveJob.Update()
. Pero si me conecté con el usuario administrador (también estoy conectado a la máquina usando este usuario) y hago clic en el enlace, crea el trabajo correctamente. También convertí al usuario en un miembro del grupo WSS_ADMIN_WPG
pero aún WSS_ADMIN_WPG
el mismo problema. ¿Hay alguna otra cosa que deba hacer para resolver el problema?
He usado RunWithElevatedPrivileges
SPSecurity.RunWithElevatedPrivileges (delegate () {});
Funciona para mí ..... ¿Alguien tiene otra solución? Si es así, por favor hágamelo saber.
Intenta anular el método SPPersistedObject.HasAdditionalUpdateAccess () y devuelve true.
protected override bool HasAdditionalUpdateAccess() { return true; }