Обновление профиля пользователя создает исключение PropertyNotEditableException в sharepoint 2010

Я пытаюсь обновить профиль пользователя 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;
}

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


person Eonasdan    schedule 06.03.2012    source источник


Ответы (5)


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

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

Я надеюсь, что это помогает

person Falco O    schedule 17.10.2012
comment
Благодарю. Я спросил об этом 7 месяцев назад, и мы ушли от проблемы. Кажется, я так и делал, но не могу вспомнить. - person Eonasdan; 17.10.2012

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

Вкратце:

Вы должны запустить обновление с повышенными правами, и вы должны установить для параметра HttpContext.Current значение null. Мое личное предположение состоит в том, что это ошибка в 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;
    }
}
person OschtärEi    schedule 23.10.2015

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

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

person Nathan Pitman    schedule 10.03.2012
comment
спасибо за ваш ответ, но я попытался установить для httpcontext значение null. Я пробовал с impersonation и без него. Я проверил, что используемая в этот момент учетная запись является администратором фермы (среда разработки). На данный момент мы делаем запись в список скрытых профилей пользователей SP и подделываем их до тех пор, пока не произойдет синхронизация AD: P - person Eonasdan; 12.03.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();
                             }
                         }
                     });
person Eonasdan    schedule 15.03.2012

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

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

person user2894506    schedule 18.10.2013