2011-02-18 54 views
1

我正尝试使用UserProfileManager显示自定义web部件中的用户列表。出于某种原因,我可以查看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

而不是获取SPSite.Owner的UserToken,你尝试过SPSite.SystemAccount.UserToken或SPWeb.AllUsers [“user”]。UserToken;

我愿意做后者如果可能的话,最低权限规则等

+0

那么我要更换这行:“SPUserToken userToken = intranet.Owner.UserToken;”与“SPUserToken userToken = SPWeb.AllUsers [”user“]。UserToken;”? “用户”是具有管理员权限的用户吗? – R100 2011-02-18 21:29:50

+0

更准确地说,SPUserToken userToken = intranet.OpenWeb()。AllUsers。[“user”]。UserToken - 是的,“user”将是具有所需特权的那个。 – 2011-02-19 00:01:56