2009-06-24 9 views
6

Ho creato una raccolta siti all'interno di un'applicazione Web con l'utente A come amministratore della raccolta siti. Ho aggiunto un link nella pagina delle caratteristiche del sito. Al clic su quel link che sto cercando di creare un job.Below timer è il codice eseguito al clic del collegamentoProblema nella creazione del lavoro del timer

//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(); 

Ora, quando mi sono collegato con l'utente A e cliccare su quel link sulla pagina 'Impostazioni sito' , Ottengo un'eccezione di sicurezza con il messaggio "Accesso negato" alla riga automaticArchiveJob.Update(). Ma se ho effettuato l'accesso con l'utente amministratore (anch'io sono connesso al computer tramite questo utente) e faccio clic sul collegamento per creare correttamente il lavoro. Inoltre, ho creato un utente membro del gruppo WSS_ADMIN_WPG, ma continuo a ottenere lo stesso problema. C'è qualcos'altro che devo fare per risolvere il problema.

risposta

23

L'accesso negato è un comportamento previsto in base a ciò che si sta tentando di fare. Permettimi di spiegare.

Quando viene creata un'istanza di lavoro timer, viene mantenuta nel database di configurazione della farm. L'accesso a questo database per scopi di scrittura è un'operazione privilegiata; come regola generale, solo l'account del servizio di farm (ovvero l'account in cui viene eseguito OWSTIMER.EXE) o gli account che dispongono esplicitamente dei diritti necessari per eseguire tale operazione sul database di configurazione (in genere gli amministratori) avranno esito positivo.

Per impostazione predefinita, il tentativo di creare un'istanza di un processo timer all'interno del contesto della raccolta siti fallirà. Il tentativo di eseguire l'operazione in un blocco privilegiato con privilegi elevati (tramite SPSecurity.RunWithElevatedPrivileges) porterà solo al contesto dell'account del pool di applicazioni dell'applicazione Web utilizzato al posto del contesto utente corrente; questo succede solo se l'account del pool di applicazioni ha i diritti per scrivere nel database di configurazione della farm. In questo caso, è in genere perché (a) l'account del servizio della farm viene utilizzato in ruoli in cui non deve essere inserito (per eseguire app Web di contenuto, ad esempio) o (b) sono state concesse autorizzazioni aggiuntive al pool di applicazioni account. Entrambi i casi rappresentano una deviazione da un modello operativo di best practice.

Le istanze di processo del timer vengono in genere create in Tempo di attivazione delle funzioni in Funzioni disponibili al livello Farm o WebApplication. Perché? Poiché tali funzioni vengono normalmente attivate dagli amministratori dalla riga di comando (presupponendo che l'amministratore disponga anche dei diritti nel database di configurazione della farm) o dall'interno di Amministrazione centrale (in cui l'attivazione avviene tramite l'account del servizio farm, è garantito il diritto al database di configurazione). Quando la funzione è attivata e viene chiamato il metodo FeatureActivated di SPFeatureReceiver, è sicuro (dal punto di vista della sicurezza) impostare il lavoro del timer.

Risolvere correttamente il tuo problema specifico comporterà un po 'di problemi. Invece di provare a istanziare il lavoro del timer all'interno della raccolta siti su richiesta, ti consigliamo di impostare l'equivalente di un lavoro timer "sweep" nel momento in cui la tua funzione è attivata. Certo, questo richiede più pianificazione e impegno rispetto a quello che stai cercando di fare, ma il tuo attuale percorso funzionerà solo se la sicurezza è in qualche modo regolata - e questo non è raccomandato.

Quando stavo assemblando la mia funzionalità BLOB cache farm flush (http://blobcachefarmflush.codeplex.com), dovevo fare la stessa cosa da sola.È possibile visualizzare le specifiche di come ho lavorato durante la creazione del lavoro timer nella classe FeatureReceiver (BlobCacheFarmFlushSweepJobFeatureReceiver). Il resto del codice e la documentazione associata possono anche aiutare con alcune delle altre sfide che emergono.

Sentiti libero di usare ciò che trovi in ​​qualsiasi modo; ecco perché è lì!

Spero che questo aiuti. Se ci sono domande di follow-up, sparare e risponderò nel modo migliore possibile :-)

+0

Hey Sean Grazie per la tua risposta ..... L'ho trovato molto utile. Richiederò sicuramente delle domande se avrò .... Grazie ancora – Anoop

+0

Come configurare ed eseguire questo lavoro, quindi? – Evgeny

+0

Sono amministratore sul mio pc. – Evgeny

-3

RunWithElevatedPrivileges ho usato

SPSecurity.RunWithElevatedPrivileges (delegato() { });

Funziona per me ..... Qualcuno ha un'altra soluzione? Se è così, per favore fatemelo sapere.

+0

Potete trovare questo utile: http://stackoverflow.com/questions/638314 –

+2

Anoop, si veda la spiegazione di Sean sopra il motivo per cui non si dovrebbe mai (essere in grado di) utilizzare il metodo che si descrive qui. Sean ha fatto un ottimo lavoro nello spiegare chiaramente questo. –

0

Provare a sovrascrivere il metodo SPPersistedObject.HasAdditionalUpdateAccess() e restituire true.

protected override bool HasAdditionalUpdateAccess() { return true; }

Problemi correlati