2010-02-04 11 views
1

J'ai essayé la recherche LDAP ci-dessous, mais elle ne me donne que l'appartenance au groupe dans lequel se trouve l'utilisateur. J'ai besoin que la recherche inclue également les appartenances des groupes ForeignSecurityPrincipals (groupes sur un domaine dans une autre forêt AD).Comment puis-je obtenir les appartenances à un groupe pour un utilisateur AD, y compris tous les groupes d'autres domaines?

public static List<string> GetGroups() 
{ 
    List<string> oGroups = new List<string>(); 
    string vLDAPPath = "GC://dc1.dom1.local/dc=dom1,dc=local"; 
    string vFilterUser = string.Format("(&(objectcategory=user)(objectsid={0}))", "S-1-5-21-122767939-1938435020-1261837966-8097"); 

    DirectoryEntry oDirEntry = new DirectoryEntry(); 
    oDirEntry.Path = vLDAPPath; 
    oDirEntry.Username = "dom1\\sysuser"; 
    oDirEntry.Password = "syspwd"; 

    DirectorySearcher oDirSearchUser = new DirectorySearcher(); 
    oDirSearchUser.SearchRoot = oDirEntry; 
    oDirSearchUser.Filter = vFilterUser; 

    SearchResult oSearchResultUser = oDirSearchUser.FindOne(); 
    if (oSearchResultUser != null) 
    { 
    using (DirectoryEntry oResultDirEntryUser = oSearchResultUser.GetDirectoryEntry()) 
    { 
     oResultDirEntryUser.RefreshCache(new string[] { "TokenGroups" }); 
     PropertyValueCollection tg = oResultDirEntryUser.Properties["TokenGroups"]; 
     foreach (byte[] SID in (Array)tg.Value) 
     { 
     string vFilterGroup = string.Format("(&(objectcategory=group)(objectsid={0}))", SIDToString(SID)); 
     DirectorySearcher oDirSearchGroup = new DirectorySearcher(); 
     oDirSearchGroup.SearchRoot = oDirEntry; 
     oDirSearchGroup.Filter = vFilterGroup; 
     SearchResult oSearchResultGroup = oDirSearchGroup.FindOne(); 
     if (oSearchResultGroup != null) 
     { 
      using (DirectoryEntry oResultDirEntryGroup = oSearchResultGroup.GetDirectoryEntry()) 
      { 
      oGroups.Add(oResultDirEntryGroup.Name); 
      } 
     } 
     } 
    } 
    } 
    return oGroups; 
} 

Répondre

0

groupes AD sont récupérées en utilisant l'attribut memberOf:

C# Exemple:

private void ConfigureEntry() 
{ 
    // configure your ad connection to the directory 
    _currentDirEntry = new DirectoryEntry(_activeDirectoryRoot, _activeDirectoryUser, _activeDirectoryPW); 

    DirectorySearch searcher = new DirectorySearcher(_currentDirEntry); 
    SearchResult result; 

    searcher.Filter = "(sAMAccountName=" & _loginName & ")"; // Or whatever criteria you use to get your directoryEntry 
    result = searcher.FindOne 

    if(result == null) return; 
    _attributes = result.Properties; 

    _currentDirEntry = null; 
} 

private StringCollection MemberBelongsToGroups() 
{ 
    StringCollection returnCollection = new StringCollection(); 

    foreach(string prop in _attributes("memberOf")) //_attributes is of type System.DirectoryServices.ResultPropertyCollection 
    { 
     int equalsIndex = prop.IndexOf("=", 1); 
     int commaIndex = prop.IndexOf(",", 1); 

     if(equalsIndex >= 0) returnCollection.Add(prop.SubString((equalsindex + 1), (commaIndex - equalsIndex) - 1)); 
    } 

    return returnCollection; 
} 
Questions connexes