2017-09-21 3 views
0

주어진 사용자가 아래의 코드에 따라 그룹에 속하는지 확인하고 있습니다. 나는군요SPSecurity.RunWithElevatedPrivileges의 승인되지 않은 예외?

승인되지 않은 예외 (0x80070005입니다)

나는 이유를 이해하지? SPSecurity.RunWithElevatedPrivileges을 사용하고 있습니다. 그렇다면이 예외를주는 이유는 무엇입니까? 누가 나 한테 암시 야? 미리 감사드립니다!

public bool IsUserInGroup(SPWeb web, string groupName, string user) 
{ 
    try 
    { 
     bool returnValue = false; 
     SPSecurity.RunWithElevatedPrivileges(() => 
     { 
      if (web.Groups.OfType<SPGroup>().Where(g => g.Name == groupName).Count() > 0) 
      { 
       SPGroup spGroup = web.Groups[groupName]; 
       if (spGroup.Users.OfType<SPUser>().Where(u => u.LoginName.Equals(user)).Count() > 0) 
       { 
        returnValue = true; 
       } 
       else 
       { 
        returnValue = false; 
       } 
      } 
      else 
      { 
       returnValue = false; 
      } 
     }); 
     return returnValue; 
    } 
    catch (Exception exp) 
    { 
     Classes.Logs.Error.Log_Error("IsUserInGroup", "DocumentCenterItem.cs", exp.Message, DateTime.Now); 
     return false; 
    } 
} 

답변

1

상승 된 권한으로 SP Web의 새 인스턴스를 만들어야합니다. 현재 구현에서는 현재 사용자 컨텍스트에서 실행되는 web 객체를 재사용하고 있습니다.

그래서 시도하고 귀하의 요구 사항에 따라 아래의 코드를 수정 :

public bool IsUserInGroup(SPWeb web, string groupName, string user) 
{ 
    try 
    { 
     bool returnValue = false; 
     SPSecurity.RunWithElevatedPrivileges(() => 
     {  
      using(SPSite site = new SPSite(web.Site.ID)) 
      { 
       using(SPWeb elevatedWeb = site.OpenWeb(web.ID)) 
       { 
        if (elevatedWeb.Groups.OfType<SPGroup>().Where(g => g.Name == groupName).Count() > 0) 
        { 
         SPGroup spGroup = elevatedWeb.Groups[groupName]; 
         if (spGroup.Users.OfType<SPUser>().Where(u => u.LoginName.Equals(user)).Count() > 0) 
         { 
          returnValue = true; 
         } 
         else 
         { 
          returnValue = false; 
         } 
        } 
        else 
        { 
         returnValue = false; 
        }    
       }    
      } 
     }); 
     return returnValue; 
    } 
    catch (Exception exp) 
    { 
     Classes.Logs.Error.Log_Error("IsUserInGroup", "DocumentCenterItem.cs", exp.Message, DateTime.Now); 
     return false; 
    } 
} 
+1

감사를 당신의 대답. 한 가지 사소한 의견입니다. 당신은'(SPWeb elevatedWeb ...)'을 사용하지 말아야합니다. 웹은 거기에 처리해서는 안됩니다. 대신에'SPWeb elevatedWeb = spSite.RootWeb'을 사용하십시오. https://gallery.technet.microsoft.com/office/SharePoint-Dispose-Checker-01da48e8에서 SPDisposerCheck 도구를 사용하는 것이 좋습니다. –

관련 문제