이유는 두 가지 범주로 가을을 상승 :
- 코드는 현재 사용자가 권한이없는있는 SharePoint의 작업을 수행 할 필요가있다. 이 작업은 을 SharePoint 보안으로 수행하는 동안 항상 수행해야합니다. 보안 상황을 더 잘 이해해야 함을 나타내는 "상황에 맞는"조치가 아니라 SharePoint 보안입니다.
- 코드는 응용 프로그램 풀 ID가 액세스 할 수 있지만 현재 사용자는 액세스 할 수없는 외부 리소스 (서버 파일 시스템, 데이터베이스, 파일 공유 등)에 액세스해야합니다.
전자의 경우 SPSite impersonation을 사용하면 훨씬 편리합니다. 후자가 내가 RWEP를 사용하는 유일한 이유입니다.
RWEP는 새 스레드를 생성하지 않습니다. 대신 Win32 API를 사용하여 현재 스레드의 ID를 프로세스 ID (되돌리기)로 되돌리고 승격 된 코드를 실행 한 다음 가장을 다시 켜고 현재 사용자를 대신하여 작업을 다시 시작합니다. 이것은 여러 가지 의미를 가지고 : 스레드가 가장 된 있지 않은 경우는 STSADM (기능 수신기)를 통해 타이머 작업, 비주얼 스튜디오 워크 플로우, 콘솔 응용 프로그램 및 코드 실행에 쓸모가 있도록
- RWEP는, 아무것도하지 않습니다.
- CodeToRunElevated에서 새 SPSite를 만드는 것으로 가정 할 경우 SharePoint에 대한 액세스는 응용 프로그램 풀 (SHAREPOINT \ system)의 권한으로 수행됩니다. 이 계정에는 현재 웹 응용 프로그램에 대한 모든 액세스 권한이 있지만 은에 SPFarm 속성 수정이나 SSP 변경 작업을 수행 할 수있는 팜 수준 권한이 없어야합니다.
- CodeToRunElevated의 실행 경계에서 ID 인식 객체 (예 : SPSite 및 해당 하위 항목)를 사용하면 정말 펑키 한 동작 및 경쟁 조건이 발생할 수 있습니다. 모든 의도와 목적에 따라 지원되지 않는 것으로 간주하십시오.
그리고 Alex가 말했듯이 SPSite의 하위 항목은 SPSite에서 사용 권한을 상속받습니다. SPSite는 SPSite의 사용 권한을 생성 할 때 SPSite의 사용 권한을 상속합니다. 따라서 SPContext.Current.Site는 CodeToRunElevated 내에서 참조하더라도 현재 사용자의 권한으로 작동합니다. 대신 상승 된 블록 내에서 새 SPSite를 만들고 소비해야합니다.
정리하면 : RWEP는 SharePoint 외부에서 응용 프로그램 풀을 가장하고 SPSite 가장은 SharePoint 내부의 응용 프로그램 풀을 가장합니다.
우수 정보, thanks Dahlbyk! –
좋은 답변입니다. 타이머 작업 등에서 쓸데없는 이유에 대해 자세히 설명해 주시겠습니까? –
SharePoint 웹 응용 프로그램은 가장을 사용하여 로그인 한 사용자로 코드를 실행합니다. - RWEP는 스레드에서 해당 가장을 일시적으로 끕니다. 타이머 작업 또는 콘솔 응용 프로그램과 같이 코드가 가장으로 실행되지 않으면 스레드 사용자 및 프로세스 사용자 (RWEP의 "승격 된 사용자")는 동일합니다. – dahlbyk