Domanda

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 funzionalità del sito. Facendo clic su quel link sto cercando di creare un processo timer. Di seguito è il codice eseguito al clic del link

//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 ho effettuato l'accesso con l'utente A e ho fatto clic su quel link nella pagina "Impostazioni sito", ho ricevuto 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 ho effettuato l'accesso alla macchina utilizzando questo utente) e ho fatto clic sul collegamento, il lavoro viene creato correttamente. Inoltre ho reso l'utente un membro del gruppo WSS_ADMIN_WPG ma ho ancora riscontrato lo stesso problema. C'è qualcos'altro che devo fare per risolvere il problema.

È stato utile?

Soluzione

Il " Accesso negato " è un comportamento previsto dato quello che stai tentando di fare. Mi permetta di spiegare.

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

Per impostazione predefinita, il tentativo di creare un'istanza di un processo timer nel contesto della raccolta siti non riuscirà. Tentare l'operazione in un blocco di privilegi elevato (tramite SPSecurity.RunWithElevatedPrivileges) comporterà solo l'utilizzo del contesto dell'account del pool di applicazioni dell'applicazione Web anziché del contesto utente corrente; ciò ha esito positivo solo se l'account del pool di app dispone dei diritti per scrivere nel database di configurazione della farm. In questo caso, è in genere dovuto al fatto che (a) l'account del servizio farm viene utilizzato in ruoli in cui non dovrebbe trovarsi (per eseguire app Web di contenuto, ad esempio) oppure (b) sono state concesse autorizzazioni aggiuntive al pool di applicazioni account. Entrambi i casi rappresentano una deviazione da un modello operativo di buone pratiche.

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

Risolvere correttamente il tuo particolare problema comporterà capovolgerlo un po '. Invece di provare a creare un'istanza del processo timer dall'interno della raccolta siti su richiesta, ti consiglio di impostare l'equivalente di un "sweep" processo timer al momento dell'attivazione della funzione. Certo, questo richiede più pianificazione e impegno di quello che stai cercando di fare, ma il tuo percorso attuale funzionerà solo se la sicurezza è in qualche modo regolata - e questo non è raccomandato.

Quando stavo mettendo insieme la mia funzione BLOB cache farm flush ( http://blobcachefarmflush.codeplex.com ) , Ho dovuto fare più o meno la stessa cosa. Puoi vedere le specifiche di come ho lavorato attraverso la creazione di processi timer nella classe FeatureReceiver (BlobCacheFarmFlushSweepJobFeatureReceiver). Il resto del codice e la documentazione associata possono anche aiutare con alcune delle altre sfide che si presentano.

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

Spero che sia d'aiuto. Se ci sono domande di follow-up, fai fuoco e risponderò il più possibile :-)

Altri suggerimenti

Prova a sostituire il metodo SPPersistedObject.HasAdditionalUpdateAccess () e restituisce true.

override protetto bool HasAdditionalUpdateAccess () {   ritorno vero; }

Ho usato RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges (delegato () { });

Funziona per me ..... Qualcuno ha un'altra soluzione? In tal caso, per favore fatemi sapere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top