Причины повышения делятся на две категории:
- Ваш код должен выполнять операции в SharePoint, для которых у текущего пользователя нет разрешений. Это всегда следует делать при работе с безопасностью SharePoint, а не в качестве меры «на всякий случай», которая указывает на то, что вам необходимо лучше понять ситуацию с вашей безопасностью.
- Вашему коду необходим доступ к внешним ресурсам (файловая система сервера, база данных, общая папка и т. Д.), К которым у удостоверения пула приложений есть доступ, а у текущего пользователя нет.
Для первых вам гораздо лучше использовать SPSite олицетворение . Последнее - единственная причина, по которой я когда-либо использовал RWEP.
Чтобы уточнить, RWEP не создает новую ветку. Вместо этого он использует API-интерфейсы Win32, чтобы вернуть идентификатор текущего потока обратно к идентификатору процесса (отключив олицетворение), чтобы запустить повышенный код, а затем снова включить олицетворение, чтобы возобновить работу от имени текущего пользователя. Это имеет несколько последствий:
- RWEP ничего не делает, если поток не олицетворен, поэтому он бесполезен в заданиях таймера, рабочих процессах Visual Studio, консольных приложениях и коде, выполняемом через stsadm (приемники функций).
- Доступ к SharePoint, если вы создадите новый SPSite в вашем CodeToRunElevated, будет осуществляться с правами пула приложений (SHAREPOINT \ system). Эта учетная запись будет иметь полный доступ к текущему веб-приложению, но не должен иметь права на уровне фермы для таких вещей, как изменение свойств SPFarm или внесение изменений в SSP.
- Использование объектов, учитывающих идентичность (таких как SPSite и его дочерние элементы) через границы выполнения вашего CodeToRunElevated, может привести к некоторым действительно странным поведениям и условиям гонки. Для всех намерений и целей, сочтите это неподдерживаемым.
И, как сказал Алекс, дочерние элементы сайта SPS наследуют свои разрешения от сайта SPS, который, в свою очередь, имеет свои права доступа, установленные при его создании. Поэтому SPContext.Current.Site будет по-прежнему работать с разрешениями текущего пользователя, даже если вы ссылаетесь на него в вашем CodeToRunElevated. Вместо этого вам нужно будет создать и использовать новый SPSite в блоке с повышенными правами.
Подводя итог: RWEP для олицетворения пула приложений вне SharePoint, SPSite олицетворение для олицетворения пула приложений внутри SharePoint.