Обновление профиля пользователя создает исключение PropertyNotEditableException в sharepoint 2010 - PullRequest
1 голос
/ 06 марта 2012

Я пытаюсь обновить профиль пользователя sharepoint 2010 и продолжаю получать эту ошибку:

Microsoft.Office.Server.UserProfiles.PropertyNotEditableException: Property Not
Editable: This property can only be modified by an administrator. 
at Microsoft.Office.Server.UserProfiles.UserProfileValueCollection.
CheckUpdatePermissions()

Сначала я обновляю AD отдельным блоком кода (который работает).Мы используем службу синхронизации профилей, поэтому значение в конечном итоге распространяется вниз, но мы хотели бы обновить профиль SP в то же время, чтобы немедленно показать изменение.

код:

using (System.Web.Hosting.HostingEnvironment.Impersonate())
{
  SPSecurity.RunWithElevatedPrivileges(delegate()
  {
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
    using (var site = new SPSite(SPContext.Current.Site.ID))
    {
        try
        {
            SPServiceContext sc = SPServiceContext.GetContext(site);
            UserProfileManager userProfileMangager = new UserProfileManager(sc);
            SPUser user = site.RootWeb.EnsureUser(loginName);
            UserProfile profile = userProfileMangager.GetUserProfile(loginName);
                try
                {
                    profile["WorkEmail"].Value = tbEmail.Text;
                    profile["WorkPhone"].Value = tbPhone.Text;
                    profile["company"].Value = tbCompany.Text;
                    profile.Commit();
                }
                catch (Exception ex)
                {
                    lblMesssage.Text = ex.ToString() + "<br/>";
                    lblMesssage.Visible = true;
                }
        }
        catch (Exception ex)
        {
            lblMesssage.Text = ex.ToString();
            lblMesssage.Visible = true;
        }
  }
});
panComplete.Visible = true;
panForm.Visible = false;
waiting.Visible = false;
litSuccess.Visible = true;
}

пара таких вещей там, когда я искал и пробовал разные вещи.Предложения?

Ответы [ 5 ]

2 голосов
/ 17 октября 2012

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

http://msscorner.de/en/2011/10/18/userprofile-manager-eigenschaft-kann-nicht-bearbeitet-werden-diese-eigenschaft-kann-nur-von-einem-administrator-geandert-werden/

Надеюсь, это поможет

0 голосов
/ 23 октября 2015

Кто бы еще не пытался это выяснить, я нашел решение благодаря этому блогу.

Короче:

Вы должны запустить обновление с повышенными правами, и выдолжны установить HttpContext.Current на ноль.Мое личное предположение состоит в том, что это ошибка в SharePoint, которая ведет себя неправильно, если задан контекст.

Фрагмент кода:

SPSecurity.RunWithElevatedPrivileges(() =>
{
    HttpContext httpContext = HttpContext.Current;
    try
    {
        SPServiceContext serviceContext = SPServiceContext.GetContext(httpContext);
        HttpContext.Current = null; // Hack !!!
        UserProfileManager upm = new UserProfileManager(serviceContext);
        //.. update your property which has "IsAdminEditable" set to true and "IsUserEditable" set to false
    }
    finally
    {
        //restore old context
        HttpContext.Current = httpContext;
    }
}
0 голосов
/ 18 октября 2013

Выполните следующие шаги, это решит проблему:

1) Перезапуск Администрирование Sharepoint служба и Таймер Sharepoint служба из services.msc
2) остановить и запустить службу профилей пользователей с помощью powershell
3) выполнить IISRESET на всех фронтальных веб-серверах, а также на сервере приложений
4) Теперь очистите кеш браузера и получите доступ к URL.

0 голосов
/ 15 марта 2012

На данный момент мы делаем запись в список скрытых профилей пользователей SP, чтобы подделать его, пока не произойдет синхронизация AD.Это не самый лучший ответ, но пока единственный, который я нашел.Я с радостью приму лучший ответ, если он придет.

SPSecurity.RunWithElevatedPrivileges(() =>
                     {
                         using (var site = new SPSite(CurrentWeb.Site.Url))
                         {
                             using (var web = site.OpenWeb(CurrentWeb.ID))
                             {
                                 web.AllowUnsafeUpdates = true;
                                 SPList userInfo = web.Site.RootWeb.Lists["User Information List"];
                                 SPListItem userItem = userInfo.Items.GetItemById(_SelectedUser.ID);
                                 userItem["Work phone"] = tbPhone.Text;
                                 userItem["Work e-mail"] = tbEmail.Text;
                                 userItem["company"] = tbCompany.Text;
                                 userItem.Update();
                             }
                         }
                     });
0 голосов
/ 10 марта 2012

Вы получили это работает в конце концов? По моему опыту, олицетворение не слишком хорошо работает со службой профилей пользователей. Он имеет тенденцию использовать HttpContext.Current.User.Identity вместо System.Security.Principal.WindowsIdentity.GetCurrent(). Попробуйте установить для HttpContext.Current значение null и посмотреть, что произойдет.

Помните также, что текущее удостоверение должно иметь привилегии Managed User Profiles.

...