2012-03-06 5 views
2

I 2010 사용자 프로필은 SharePoint를 업데이트하려고 내가이 오류가 계속에 PropertyNotEditableException을 던졌습니다). 우리는 프로필 동기화 서비스를 사용하므로 가치가 결국에는 전파되지만 SP 프로필을 동시에 업데이트하여 변경 사항을 즉시 보여주고 싶습니다.업데이트 사용자 프로필은 SharePoint 2010의

코드 : 나는 주위를 검색하고 다른 일을 시도했습니다 같은 것들의

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; 
} 

부부가에 있습니다. 제안?

답변

0

우리가 지금하고있는 일은 AD 동기화가 발생할 때까지 스푸핑 (spoof)하기 위해 숨겨진 SP 사용자 프로필 목록에 쓰는 것입니다. 이것은 실제로 가장 좋은 대답은 아니지만 지금까지 내가 찾은 유일한 답변입니다. 나는 더 좋은 대답을 기꺼이 받아 들일 것이다.

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

이 작업을 끝내셨습니까? 내 경험에 의하면 가장 (impersonation)이 사용자 프로필 서비스와 잘 작동하지 않습니다. System.Security.Principal.WindowsIdentity.GetCurrent() 대신 HttpContext.Current.User.Identity을 사용하는 경향이 있습니다. HttpContext.Current를 null로 설정하고 어떤 일이 일어나는지보십시오.

또한 현재 ID에는 관리 된 사용자 프로필 권한이 있어야합니다.

+0

감사하지만 null로 HttpContext를 설정하려 :

코드 스 니펫. 나는 '가장 (impersonation)'이 있건 없건간에 노력했다.그 시점에서 사용중인 계정이 팜 관리자 (dev 환경)인지 확인했습니다. 이 시점에서 우리가 수행하는 작업은 숨겨진 SP 사용자 프로필 목록에 쓰고 AD 동기화가 발생할 때까지 스푸핑하는 것입니다. P – Eonasdan

2

이 예외의 문제는 귀하의 코드가 아닙니다. 그것은 당신이 바꾸고 싶은 분야의 타락한 설정입니다. 다음은 post입니다.이 설명은 솔루션을 설명하고 필드 설정을 변경해야하기 때문입니다.

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

가 나는

+0

감사합니다. 나는 이것을 7 개월 전에 물었고 우리는 그 문제에서 벗어났다. 내가 그랬던 것처럼 보이지만 나는 기억할 수 없다. – Eonasdan

0

이 문제가 해결됩니다 단계들 아래 수행 도움이되기를 바랍니다 :

1) 다시 시작 SharePoint 관리를 서비스와 services.msc를
에서 셰어 타이머 서비스 2) powershell을 사용하여 사용자 프로필 서비스를 중지하고 시작하십시오.
3) IISRESET 모든 웹 프런트 서버 및 앱 서버에
4) 이제 브라우저 캐시를 지우고 URL에 액세스하십시오.

0

누가 이것을 알아 내려고 노력하고 있든간에 나는 this 블로그 덕분에 해결책을 찾았습니다. 즉

:

당신은 상승 업데이트를 실행해야하고 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; 
    } 
} 
관련 문제