2011-03-14 22 views
3

試圖讓所有用戶所屬的組,包括初級組:獲得初級組ID

做這樣的事情:

DirectoryEntry entry = new DirectoryEntry(LDAP:/domainXYZ, userx, passwordx); 
DirectorySearcher searcher = new DirectorySearcher(entry); 
searcher.Filter = String.Format("(&(objectClass=user)(userPrincipalName={0}{1}))", userY, LDAP://domainXYZ); 
SearchResultCollection resultColln= searcher.FindOne(); 

string actualGroupName =string.empty; 
string grp =""; 
foreach (SearchResult singleRes in resultColln) 
{ 
    foreach (object value in singleRes.Properties["memberof"]) 
    { 
     grp = value.ToString(); 
     Console.WriteLine("group:{0} ", grp); 
    } 
} 

這使我除了主組中的所有組。有沒有辦法讓主組名稱,除了其他組使用primaryGroupID

+1

這有幫助嗎? http://dunnry.com/blog/2005/01/18/DeterminingYourPrimaryGroupInActiveDirectoryUsingNET.aspx – RQDQ 2011-03-14 21:44:29

回答

1

你應該使用下面的搜索過濾器

string.Format("(&(objectCategory=group)(objectClass=group)(primaryGroupToken={0}))", singleRes.Properties["primaryGroupID"]); 

primaryGroupToken是創建組時自動由Active Directory生成的計算屬性進行另一次搜索。分配給用戶的primaryGroupID正在存儲此值。

其實,如果你想要一個真的簡單的方法,我會建議UserPrincipal.GetGroups真的很容易。唯一的問題是你只能在.NET 3.5或更高版本中找到它。

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "yourdomain.com")) 
{ 
    using (UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "YourUser")) 
    { 
     foreach (Principal p in user.GetGroups()) 
     { 
      Console.WriteLine(p.Name); 
     } 
    } 
} 

GetGroups回報你只直接包含你的用戶,包括其主要組的組。如果你想獲得所有的嵌套組,你可以使用GetAuthorizationGroups

+0

我認爲你的第一個例子需要是:'singleRes.Properties [「primaryGroupID」]。Value'而不是簡單的:'singleRes.Properties [ 「primaryGroupID」]' – 2013-01-27 17:28:44

+0

除此之外,您不能將構造的屬性用作LDAP過濾器:http://blogs.technet.com/b/efleis/archive/2004/11/17/258710.aspx – 2013-01-27 17:47:52