【问题标题】:Allowing UserProfileManager Permissions in SharePoint 2010在 SharePoint 2010 中允许 UserProfileManager 权限
【发布时间】:2011-06-30 02:27:39
【问题描述】:

我正在尝试使用 UserProfileManager 在自定义 Web 部件中显示用户列表。出于某种原因,我可以查看 webpart 并且所有配置文件都输出到屏幕上(可能是因为我是管理员)。但是当标准用户登录时,他们会遇到 403 页面。

我已经对此进行了一些阅读,并且我知道它与权限有关。这就是我的代码中的内容:

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?

谢谢!

【问题讨论】:

    标签: sharepoint permissions sharepoint-2010 web-parts


    【解决方案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;
    

    希望这段代码可以解决错误。

    【讨论】:

    • 感谢您的回复。我实际上通过添加 HttpContext currentContext = HttpContext.Current; 使用了类似的方法HttpContext.Current = null;
    • 如果网站允许匿名用户,这将不起作用。
    【解决方案2】:

    你有没有试过SPSite.SystemAccount.UserToken,或者SPWeb.AllUsers["user"].UserToken,而不是SPSite.Owner的UserToken;

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

    【讨论】:

    • 所以我替换行:“SPUserToken userToken = intranet.Owner.UserToken;”与“SPUserToken userToken = SPWeb.AllUsers["user"].UserToken;"? “用户”会是具有管理员权限的用户吗?
    • 更准确地说,SPUserToken userToken = intranet.OpenWeb().AllUsers.["user"].UserToken - 是的,"user" 将是具有所需权限的那个。
    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多