Разрешение разрешений UserProfileManager в SharePoint 2010 - PullRequest
1 голос
/ 18 февраля 2011

Я пытаюсь отобразить список пользователей в пользовательской веб-части с помощью UserProfileManager.По какой-то причине я могу просматривать веб-части, и все профили выводятся на экран (возможно, потому что я администратор).Но когда в систему входит обычный пользователь, он сталкивается со страницей 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 для пользователя, что все разрешения, необходимые для получения профилей пользователей?

Спасибо!

Ответы [ 2 ]

1 голос
/ 11 апреля 2012

Я ценю, что этот вопрос старый, но у меня была точно такая же проблема.Чтобы помочь оригинальному постеру и другим пользователям, я изменил код из исходного поста следующим образом:

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 голосов
/ 19 февраля 2011

Вместо того, чтобы получить UserToken от SPSite.Owner, вы пробовали SPSite.SystemAccount.UserToken или SPWeb.AllUsers ["user"]. UserToken;

Я бы сделал последнее, если это возможно, правилонаименьших привилегий и т. д.

...