Итак проблема
Вот класс-обертки для вызова
SPSecurity.RunWithElevatedPriveledges игнорируется
при использовании команд LinqToSharePoint,
так как для выполнения команд в любом случае берется текущий
контекст, SPContext.Current, если он не пуст. И только если мы выполняем команды вне веб-контекста, он
сформирует контекст из наших данных.
Проблема решается, путем «подсовывания» текущему
контексту, того Web
данных, который мы используем внутри RunWithoutPriveledges.
Делается это так:
1) Запоминаем
текущий веб-контекст
2) Выполняем
RunWithoutPriveledges
3) Внутри
открываем Site и Web
4) Ассоциируем
текущий контекст с новым Web
5) Открываем
DataContext LinqToSharePoint
6) Выполняем
все команды с повышенными правами
7) Закрываем
Web и Site
8) Восстанавливаем
веб-контекст из п.1
Техническая реализация описана в этой ссылке:
public class LinqToSPSecurity
{
public static void RunWithElevatedPriveledges(SPWeb web, Action<SPWeb> action)
{
Guid webId = web.ID;
Guid siteId = web.Site.ID;
HttpContext backupCtxt = HttpContext.Current;
try
{
if (SPContext.Current != null)
HttpContext.Current = null;
SPSecurity.RunWithElevatedPrivileges(() =>
{
using (SPSite elevatedSite = new SPSite(siteId))
{
using (SPWeb elevatedWeb = elevatedSite.OpenWeb(webId))
{
HttpRequest httpRequest = new HttpRequest("", elevatedWeb.Url, "");
HttpContext.Current = new HttpContext(httpRequest, new HttpResponse(new System.IO.StringWriter()));
SPControl.SetContextWeb(HttpContext.Current, elevatedWeb);
action(elevatedWeb);
}
}
});
}
finally
{
if (SPContext.Current != null)
HttpContext.Current = backupCtxt;
}
}
public static void RunWithElevatedPriveledges(Action<SPWeb> action)
{
RunWithElevatedPriveledges(SPContext.Current.Web, action);
}
}
