2011-02-18 3 views
1

UserProfileManager를 사용하여 사용자 지정 웹 파트에 사용자 목록을 표시하려고합니다. 웬일인지, 나는 webpart를 볼 수있다. 그리고 모든 프로필은 화면에 출력된다 (아마 내가 관리자이기 때문에). 그러나 표준 사용자가 로그인하면 403 페이지가 표시됩니다.SharePoint 2010에서 UserProfileManager 권한 허용

나는 이것에 대해 약간의 글을 읽었으며 허가와 관련이있다. 이것은 내가 내 코드에있는 것입니다 :

private DataTable GetProfiles() 
    { 
     DataTable dtUserProfile = new DataTable(); 
     //...DataTable Columns 

     SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      Guid guid = SPContext.Current.Site.ID; 

      using (SPSite intranet = new SPSite(guid)) 
      { 
       SPUserToken userToken = intranet.Owner.UserToken; 

       //Get current intranet context. 
       SPServiceContext sContext = SPServiceContext.GetContext(intranet); 

       UserProfileManager profileManager = new UserProfileManager(sContext); 

       int totalUsers = int.Parse(profileManager.Count.ToString()); 

       Random random = new Random(); 

       for (int i = 0; i < NumberOfUsersToRetrieve(NoOfProfiles, totalUsers); i++) 
       { 
        int randNumber = random.Next(1, totalUsers); 

        DataRow drUserProfile; 

        UserProfile up = profileManager.GetUserProfile(randNumber); 

        drUserProfile = dtUserProfile.NewRow(); 

        drUserProfile["DisplayName"] = up.DisplayName; 
        drUserProfile["FirstName"] = up["FirstName"].Value; 
        drUserProfile["LastName"] = up["LastName"].Value; 
        drUserProfile["Department"] = up["Department"].Value; 
        drUserProfile["ContactNumber"] = up["Office"].Value;       
        drUserProfile["MySiteUrl"] = up.PublicUrl; 

        dtUserProfile.Rows.Add(drUserProfile); 
       } 
      } 
     }); 

     return dtUserProfile; 
    } 

내 코드는 기본적으로 내가 반환 할 사용자의 수에 따라 사용자의 임의의 컬렉션을 가져옵니다.

사용자 프로필을 검색하는 데 필요한 모든 권한이있는 사용자에 대해 SPUserToken을 만들 수 있습니까?

감사합니다.

답변

1

을 가능하면 후자를 할 거라고,하지만 난 똑같은 문제가 있었다. 원래 포스터 및 다른 사용자를 돕기 위해, 나는 다음에 원래의 게시물의 코드를 변경 한 :

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
    SPSite sc = new SPSite(SPContext.Current.Site.ID); 
    SPServiceContext context = SPServiceContext.GetContext(sc); 

    HttpContext currentContext = HttpContext.Current; 
    HttpContext.Current = null; 

    UserProfileManager profileManager = new UserProfileManager(context); 

    IEnumerator profileEnum = profileManager.GetEnumerator(); 

    while (profileEnum.MoveNext()) 
    { 
     UserProfile up = (UserProfile)profileEnum.Current; 

     if ((up["FirstName"] != null && up["FirstName"].Value != null && !String.IsNullOrEmpty(up["FirstName"].Value.ToString())) 
      && (up.PublicUrl != null && !String.IsNullOrEmpty(up.PublicUrl.ToString()))) 
     { 
      DataRow drUserProfile; 

      drUserProfile = dtUserProfile.NewRow(); 

      drUserProfile["DisplayName"] = up.DisplayName; 
      drUserProfile["FirstName"] = up["FirstName"].Value; 
      drUserProfile["LastName"] = up["LastName"].Value; 
      drUserProfile["Department"] = up["Department"].Value; 
      drUserProfile["Location"] = up["SPS-Location"].Value;   

      drUserProfile["MySiteUrl"] = up.PublicUrl.ToString().Replace(@"\", @"&#92;"); 

      dtUserProfile.Rows.Add(drUserProfile); 
     } 
    } 
} 

HttpContext.Current = currentContext; 

는 희망이 코드는 오류를 해결해야한다.

+0

답장을 보내 주셔서 감사합니다. 실제로 HttpContext를 추가하여 유사한 접근 방식을 사용했습니다. currentContext = HttpContext.Current; HttpContext.Current = null; – R100

+0

사이트에서 익명 사용자가 허용 된 경우에는 작동하지 않습니다. –

0

SPSite.Owner의 UserToken을 가져 오는 대신 SPSite.SystemAccount.UserToken 또는 SPWeb.AllUsers [ "user"]를 시도해 보셨습니까? UserToken;

나는 등 최소 권한의 규칙 나는이 질문은 오래된 감사

+0

그래서 줄 바꾸기 : "SPUserToken userToken = intranet.Owner.UserToken;" "SPUserToken userToken = SPWeb.AllUsers ["user "]."UserToken; "?" "사용자"가 관리 권한이있는 사용자일까요? – R100

+0

보다 정확하게 SPUserToken userToken = intranet.OpenWeb(). AllUsers. [ "user"]. UserToken - 예, "priv"는 필수 priv가있는 사용자입니다. –

관련 문제