Em algumas situações é necessário executar partes do código com um usuário do sistema que possui acesso irrestrito. Por exemplo, o usuário pode não possuir permissão de acesso em todos os subsites dos sites collections. Caso ele esteja desenvolvendo uma webpart para informar o espaço utilizado em cada site será necessário executar o código com privilégios elevados para obter também os sites que ele não tem acesso.
SPSecurity.RunWithElevatedPrivileges(delegate()
{
// executar tarefas com o "system account"
});
Atenção: Caso seja necessário utilizar alguma variável definida fora da chamada SPSecurity.RunWithElevatedPrivileges, essa variável possuirá os privilégios do usuário e não da conta de sistema. O exemplo mais comum é utilizarmos o SPControl.GetContextSite(this.Context) conforme abaixo:
Código incorreto:
SPSecurity.RunWithElevatedPrivileges(delegate() {
using (SPSite site = SPControl.GetContextSite(this.Context))
{
// o site será baseado no usuário que executa o código
}
});
O código acima não funcionará pois o contexto utilizado para obter o valor da variável site ainda era do usuário.Código correto:
SPSecurity.RunWithElevatedPrivileges(delegate() {
using (SPSite site = new SPSite(web.Site.ID))
{
// site será baseado nas permissões do system account
}
});