Chi di voi già lavora tramite il modello ad oggetti di SharePoint saprà sicuramente che, tramite un metodo di una specifica classe di tale modello, abbiamo la possibilità di eseguire una particolare porzione di codice (quindi delle azioni vere e proprie sui contenuti di SharePoint) tramite i privilegi dell'utente di sistema. Privilegi che ci danno la possibilità di fare un pò quello che vogliamo sui contenuti, bypassando quindi il controllo sui privilegi dell'utente corrente.

Questa operazione si effettua utilizzando il metodo RunWithElevatedPrivileges della classe SPSecurity. Ne abbiamo già parlato su questo sito, perchè ci sono un pò di accorgimenti da utilizzare per far sì che questo metodo funzioni così come desideriamo.

Onde evitare problemi nel suo utilizzo, vi lascio qui un extension method che utilizziamo in Dev4Side, molto utile proprio per trarre vantaggio da questa funzionalità.

namespace D4S.SharePoint.Core.SPExtensions
{
    public static class SPWebExtensions
    {
        public delegate void CodeToRunElevated(SPWeb elevatedWeb);

        public static void RunElevated(this SPWeb web, CodeToRunElevated secureCode)
        {
            string webUrl = web.Url;
            SPSecurity.RunWithElevatedPrivileges(() =>
            {
                using (SPSite site = new SPSite(webUrl))
                {
                    try
                    {
                        site.AllowUnsafeUpdates = true;
                        using (SPWeb elevatedWeb = site.OpenWeb())
                        {
                            try
                            {
                                elevatedWeb.AllowUnsafeUpdates = true;
                                secureCode(elevatedWeb);
                            }
                            finally
                            {
                                elevatedWeb.AllowUnsafeUpdates = false;
                            }
                        }
                    }
                    finally
                    {
                        site.AllowUnsafeUpdates = false;
                    }
                }
            });
        }
    }
}

Per utilizzarlo vi basta inserire il namespace tra le direttive using e scrivere la seguente porzione di codice:

var currentWeb = SPContext.Current.Web;
currentWeb.RunElevated(elevatedWeb =>
{
     //operazioni eseguite con privilegi elevati
});

Questo metodo fa parte di una libreria un pò più grossa, che abbiamo deciso di rendere pubblica e in cui sono presenti un pò di metodi per fare tutte quelle operazioni di uso quotidiano all'interno di progetti SharePoint.
Ecco il link del repository: http://github.com/dev4side/SharePoint.Core
Se volete potete partecipare anche voi a migliorarlo, facendo un fork del progetto e proponendo le vostre modifiche.