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