2013-08-21 39 views
2

我有一些代碼檢查Active Directory爲用戶所屬的所有組,這在本地開發環境中正常工作,但不會在我發佈到測試系統時正常工作。活動目錄羣組不被退回

一位同事建議可能應用程序池運行在IIS下的帳戶無法輪詢Active Directory。情況會是這樣嗎?什麼可能導致沒有團體被退回?

當我在本地運行我的代碼時,我能夠檢索列表,但是測試會回到空白狀態。根本沒有錯誤。

示例代碼,在那裏我變「活」到「TEST」,因爲我們有一個多域網絡,但既不作品:

UserPrincipal user = UserPrincipal.Current; 
if (user != null) 
{ 
    PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "TEST"); 
    List<Principal> groupResults = user.GetGroups(principalContext).ToList(); 
} 
+0

這可能是一個愚蠢的問題,但是你完全確定在測試環境中有AD組嗎? –

+0

當然不是一個愚蠢的問題!我的誠實答案是我不知道,但是因爲我已經將域名(假設這實際上正常工作)更改爲Live,並且它仍然沒有返回任何內容,並且我知道Live AD系統具有以我的名字列出的組...但如果它最終檢查對IIS帳戶,這將是另一回事。 – MattR

+0

這是一個在IIS中的NetworkService用戶上下文中運行的Web應用程序嗎?另外,你會知道你想找到組的特定用戶的名字嗎? – Scampbell

回答

2

看來問題與您用來獲取羣組的用戶有關。 UserPrincipal.Current獲取其運行線程的用戶帳戶。在IIS應用程序中,該帳戶是在應用程序的IIS應用程序池標識中指定的帳戶。如果你想找到Active Directory組特定的用戶帳戶來獲得,您可以使用此代碼組(.NET 4):

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "TEST");) 
{ 
    UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "A_User_Name"); 
    foreach (var group in user.GetGroups()) 
    { 
     Console.WriteLine(group.Name); 
    } 
} 

如果要比較這對用戶和組的結果一個特定的域名,你可以使用這個工具:"Active Directory Users and Computers"

+0

這當然是它的一部分。特別設置用戶名後,我可以看到的問題是選擇一個不同的域,當我測試它時似乎沒有任何不同的結果後,我從我的名字添加/刪除組。 – MattR

+1

您是否嘗試過使用該Active Directory用戶和計算機實用程序來比較爲每個域中的用戶名返回的組?您可以將其分別指向每個域,並查看您正在使用的用戶是其中一部分的組。 – Scampbell

1

如果是ASP.NET這應該工作:

public static List<string> GetGroups(string userName) 
    { 
     RoleProvider roleProvider = new WindowsTokenRoleProvider(); 
     return roleProvider.GetRolesForUser(userName).ToList(); 
    } 

超級簡單

1

我不是100%肯定,但我認爲這是不是你的代碼簡單得多:

UserPrincipal user = UserPrincipal.Current; 

if (user != null) 
{ 
    List<Principal> groupResults = user.GetGroups().ToList(); 
}