Итак проблема
Вот класс-обертки для вызова
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); } }