Finalmente sono stati capiti i motivi per cui il metodo RunWithElevatedPrivileges della classe SPSecurity a volte smetteva di funzionare. Viene svelato tutto in questo post:
http://moldenco.blogspot.com/2007/05/spsecurityrunwithelevatedprivileges-to.html

In pratica, per usufruire del corretto funzionamento di tale metodo, bisogna:

  • creare sempre dei nuovi oggetti di tipo SPSite o SPWeb, senza prenderli dal contesto (per esempio attraverso i metodi GetContextSite o GetContextWeb della classe SPControl)
  • settare sempre a true la proprietà AllowUnsafeUpdates della classe SPWeb.
Seguite queste indicazioni il metodo RunWithElevatedPrivileges funziona sempre alla perfezione.

public void QualsiasiCosa() 

{
//... SPSecurity.RunWithElevatedPrivileges(mioMetodo);
}

public void mioMetodo()
{
SPSite site = new SPSite("http://localhost");
SPWeb web = site.AllWebs["NomeDelSito"];
using(web)
{
site.AllowUnsafeUpdates = true;

//codice eseguito con privilegi da admin
site.AllowUnsafeUpdates = false;
}
}