Eseguire il codice con elevati privilegi in SharePoint
Un esempio di come eseguire del codice con elevati privilegi in SharePoint 2007 (WSS3 - MOSS).
L'importante è non usare gli oggetti restituiti dal contesto in quando vengono eseguiti con i privilegi dell'utente corrente, vanno sempre creati nuovi oggetti all'interno del metodo SPSecurity.RunWithElevatedPrivileges.
Il codice è eseguito con i privilegi dell'utente configurato nell'application pool della WebApplication.
Vedi anche Eseguire il codice con elevati privilegi 2
Il precedente esempio era questo ma non funzionava correttamente in caso di web application estese in quanto creava gli oggetti sempre sulla zona di default:
Questo vuol dire che se avevo la zona di default su http://mioserver
e la zona intranet su http://sp.sgart.it
, collegandomi da internet, tutti gli oggetti venivano creati sulla zona default, è quindi tutti i link (web, liste e item) puntavano ad http://mioserver
e non su http://sp.sgart.it
.
L'importante è non usare gli oggetti restituiti dal contesto in quando vengono eseguiti con i privilegi dell'utente corrente, vanno sempre creati nuovi oggetti all'interno del metodo SPSecurity.RunWithElevatedPrivileges.
C#
//using Microsoft.SharePoint;
//using Microsoft.SharePoint.Utilities;
//recupero il web corrente, in questo caso dal contesto
string urlContext = SPContext.Current.Web.Url;
//elevo i privilegi
SPSecurity.RunWithElevatedPrivileges(delegate(){
//per impersonate, creo nuovi oggetti
using (SPSite site = new SPSite(urlContext))
{
using (SPWeb web = site.OpenWeb())
{
bool allowUnsafe = web.AllowUnsafeUpdates;
web.AllowUnsafeUpdates = true;
try
{
//il codice da eseguire con
//elevati privilegi ovvero
//l'utente dell'application pool
//SHAREPOINT\system
}
catch (Exception ex)
{
}
finally
{
web.AllowUnsafeUpdates = allowUnsafe;
}
}
}
});
Vedi anche Eseguire il codice con elevati privilegi 2
Il precedente esempio era questo ma non funzionava correttamente in caso di web application estese in quanto creava gli oggetti sempre sulla zona di default:
C#
//using Microsoft.SharePoint;
//using Microsoft.SharePoint.Utilities;
//recupero il web corrente, in questo caso dal contesto
SPWeb webCurrent = SPContext.Current.Web;
//elevo i privilegi
SPSecurity.RunWithElevatedPrivileges(delegate(){
//per impersonate, creo nuovi oggetti
using (SPSite site = new SPSite(webCurrent.Site.ID))
{
using (SPWeb web = new SPWeb(webCurrent.ID))
{
bool allowUnsafe = web.AllowUnsafeUpdates;
web.AllowUnsafeUpdates = true;
try
{
//il codice da eseguire con
//elevati privilegi ovvero
//l'utente dell'application pool
//SHAREPOINT\system
}
catch (Exception ex)
{
}
finally
{
web.AllowUnsafeUpdates = allowUnsafe;
}
}
}
});