2010-08-04 45 views
9

我在使用Web應用程序中的UserPrincipal類的GetAuthorizationGroups方法時遇到問題。UserPrincipal.GetAuthorizationGroups()方法的錯誤

使用下面的代碼,我收到「試圖獲取授權團體,一個錯誤(5)發生」

PrincipalContext context = new PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM", "username", "password"); 
UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "joe.blogs"); 
var groups = p.GetAuthorizationGroups(); 

我相信,此代碼的工作在一定程度上。

  • 當我查看上下文對象,我可以看到服務器和用戶名/密碼已在對象正確解析
  • 當我查看p對象,我可以看到廣告的詳細信息已填充喜歡這款手機沒有等等。

這是來自錯誤的堆棧跟蹤。

[PrincipalOperationException: While trying to retrieve the authorization groups, an error (5) occurred.] 
    System.DirectoryServices.AccountManagement.AuthZSet..ctor(Byte[] userSid, NetCred credentials, ContextOptions contextOptions, String flatUserAuthority, StoreCtx userStoreCtx, Object userCtxBase) +317279 
    System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ(Principal p) +441 
    System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroupsHelper() +78 
    System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups() +11 

通過從PrincipalContext構造函數中刪除的用戶名和密碼信息,並改變applicationpool(IIS7中),以相同的用戶([email protected])運行 - 下面的代碼工作。

PrincipalContext context = new PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM"); 
UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "joe.blogs"); 
var groups = p.GetAuthorizationGroups(); 

我需要獲得代碼的第一個例子來工作 - 我不想運行的應用程序池的域用戶只是爲了得到這個代碼的工作。

回答

2

錯誤5表示ERROR_ACCESS_DENIED,這表明與權限相關的問題。這就是說,下面的代碼剛工作對我來說,運行在Windows 7與網站運行的默認應用程序池:.aspx頁面中的「身體」的

內容:

<asp:GridView ID="GridView1" runat="server"> 
</asp:GridView> 

代碼隱藏:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var Context = new PrincipalContext(ContextType.Domain, "logon_domain", "username", "password"); 
    var principal = UserPrincipal.FindByIdentity(Context, "user_to_query"); 
    var groups = principal.GetAuthorizationGroups(); 

    GridView1.DataSource = groups; 
    GridView1.DataBind(); 
} 

在我的例子logon_domain是的domain_name\username左手,而不是你使用的域名規範的風格。我的解決方案可能會或可能不適合你。如果沒有,它確實指向某個地方的權限問題。

+0

感謝羅布,我已經在PrincipalContext構造函數中嘗試了許多組合,但不幸運。我認爲我的問題的根本原因是知道應用程序用戶調用GetAuthorizationGroups()方法的權限要求。我的應用程序用戶已經讀取了OU中對象的所有信息權限。目前我正通過閱讀用戶的memberOf屬性來完成這一任務。這個提升者只是第一級而不是遞歸的。 – 2010-08-17 12:50:43

+0

FWIW,我有一個工作版本,我使用'var Context = new PrincipalContext(ContextType。域,「logon_domain」);',所以上下文純粹是一個域,並且在Win7 /默認應用程序池中也沒有錯誤。您在域上運行代碼的機器是否已加入? – Rob 2010-08-17 13:23:03

+1

是的,加入到域中。如果我在網絡服務(AppPool)中使用PrincipalContext(ContextType.Domain,「logon_domain」)構造函數,它不起作用。如果我將AppPool更改爲與方法PrincipalContext(ContextType.Domain,null,「DC = MyCompany,DC = COM」,「username」,「password」)中使用的用戶相同的用戶,那麼它確實可行! – 2010-08-17 22:09:55

5

我處理了這個相同的問題。參見類似問題的討論。 https://stackoverflow.com/a/8347817/2012977

解決方案低於:

public List<GroupPrincipal> GetGroups(string userName) 
    { 
     var result = new List<GroupPrincipal>(); 
     PrincipalContext ctx = GetContext(); /*function to get domain context*/ 
     UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userName); 
     if (user != null) 
     { 
      PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups(); 

      var iterGroup = groups.GetEnumerator(); 
      using (iterGroup) 
      { 
       while (iterGroup.MoveNext()) 
       { 
        try 
        { 
         Principal p = iterGroup.Current; 
         result.Add((GroupPrincipal) p); 
        } 
        catch (PrincipalOperationException) 
        { 
         continue; 
        } 
       } 
      } 
     } 

     return result; 
    } 
0

有管理員看看AD帳戶返回錯誤代碼5.我遇到了,今天的用戶,它原來是該用戶的設置帳戶。有一個複選框可以繼承未檢查的安全設置(所有其他用戶都被選中)。這爲我解決了它。