Domanda

Ho una situazione in cui ci sono rigidi requisiti di autorizzazioni su un elenco di cui ho già scritto un modulo personalizzato. Il requisito è che alla creazione, in base ai metadati, solo alcuni utenti hanno accesso a leggere e scrivere l'oggetto.

Il mio primo tentativo in questo è stato metterlo in un ricevitore di eventi sulla lista per assicurarsi che le autorizzazioni vengano aggiornate al momento dell'articolo. Ho inserito l'oggetto nell'evento aggiunto dell'articolo Durante l'articolo aggiungendo che non ho un modo per elevare i privilegi e ottenere un'istanza elevata dell'oggetto (che lo so). Ciò ha causato un ritardo indesiderato, sebbene breve, tra il tempo in cui è stato creato l'oggetto e il tempo in cui il codice correva in realtà.

La prossima cosa che ho provato era quello di inserire le autorizzazioni dell'oggetto nel modulo immediatamente dopo aver creato l'elemento da quando avrei quindi un ID per l'articolo in modo che possa recuperarlo in un contesto elevato (voglio che l'oggetto sia creato sotto il contesto dell'utente corrente). Questo è problematico perché non appena questo approccio è stato implementato, circa il 50% delle volte ottenuto un errore in un flusso di lavoro che viene eseguito sull'elemento creato dicendo: "Impossibile avviare il flusso di lavoro. Il flusso di lavoro non può accedere all'elemento a cui è stato applicato. " (Vale la pena notare che questo è un flusso di lavoro Nintex) - presumo che il problema sia dovuto a qualche condizione di gara dove nel mezzo dell'oggetto.Update () per impostare le autorizzazioni, il flusso di lavoro tenta di iniziare contemporaneamente. .

Idealmente vorrei essere in grado di aggiornare le autorizzazioni sul primo aggiornamento dell'oggetto (creare) o durante un evento antibattese, ma non sono sicuro di come farlo senza elevare l'intero processo in modo che l'oggetto sia quindi creato da L'account di sistema e non l'utente che ha effettivamente creato l'oggetto.

Quali opzioni mi sono a disposizione?

È stato utile?

Soluzione

Il modo in cui è stato originariamente che usi l'evento dettagliato è stato corretto.C'è solo un passo che manca anche - è possibile effettuare l'esecuzione dell'evento immediatamente cambiandola per eseguire in modo sincrono invece di asincrono.

Dettagli su come cambiare la modalità sincrona sono qui: http://blogs.techt.com/b/stefan_Gossner/Archive/2011/11/10/USHUSING-SYNCHRONOUS-QUOT-AFTER-Qual-eventi-EG-ItemUpdated-in-SharePoint-2010.aspx

Altri suggerimenti

Un approccio che potresti provare, consentendo l'approvazione del contenuto su tale elenco.Ciò significherà, che ogni volta che viene creato un nuovo elemento, rimarrà in uno stato in attesa di fino a quando non viene approvato.Quando un articolo è in sospeso, solo l'originatore dell'articolo e le persone che hanno autorizzazioni per gestire elenchi e librerie possono vederlo, a condizione che tu abbia scelto la seguente impostazione: chi dovrebbe vedere Draft Articles in questa biblioteca dei documenti?-> Solo gli utenti che possono approvare gli elementi (e l'autore dell'articolo). Quindi, è possibile utilizzare l'evento dettagliato per modificare le autorizzazioni del file e inserire anche lo stato approvato .

Spero che questo ti aiuti nel tuo particolare scenario.

Dovresti essere in grado di impersonare l'utente che ha creato l'elemento o ha effettuato la modifica del codice.

    public override void ItemUpdating(SPItemEventProperties properties)     
       {     
           base.ItemUpdating(properties);

           SPUserToken objSPUserToken = properties.OriginatingUserToken;

           if (objSPUserToken != null) 
           { 
               using (SPSite objSPSite = new SPSite(properties.SiteId, objSPUserToken)) 
               { 
                   using (SPWeb objSPWeb = objSPSite.OpenWeb())

                   { 
                       //You can perform user context specific changes here... 
                   } 
               } 
           }
       }
.

elevazione di impersonizzazione di privilegi Impersonazione degli eventi in SharePoint 2010 .

Quello che ho fatto per aggirare questo problema è quello invece di avviare automaticamente il flusso di lavoro tramite le impostazioni del flusso di lavoro, stiamo "manualmente" il calcio del flusso di lavoro tramite il codice dopo che le autorizzazioni sono aggiornate.

string workflowId = "{...}"; //dynamically retrieve workflow id
SPWorkflowManager workflowManager = item.Web.Site.WorkflowManager;
SPWorkflowAssociationCollection workflowCollection = item.ParentList.WorkflowAssociations;

foreach (SPWorkflowAssociation workflow in workflowCollection)
{
    if (String.Compare(workflow.BaseId.ToString("B"), workflowId, true) == 0)
    {
        workflowManager.StartWorkflow(item, workflow, workflow.AssociationData, true);
        break;
    }
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top