2009-05-06 2 views
4

사용자가 속한 그룹의 commonName 만 필요합니다.DirectoryEntry memberOf 속성은 전체 경로를 반환합니다.

DirectoryEntry user = new DirectoryEntry("LDAP://cn=myuser...."); 
foreach(string path in user.Properties["memberOf"]) 
    Console.WriteLine(path); 

그러면 memberOf 속성에는 그룹의 전체 경로 인 문자열 집합이 포함됩니다. 그것은 의미가 있지만, 내가 원하는 것은 아닙니다.

나는 각자 그 경로에 대한 새로운 이름을 얻기 위해 DirectoryEntry를 새로 만들지는 않았지만 간단히 경로에서 CN을 파싱하는 것이 가장 좋은 방법 일까? (다소 황당한 것 같습니다)

사용자가 속한 그룹의 SearchResults를 얻는 더 좋은 방법이 있어야합니다.

BTW, 이것은 .NET 2이므로 멋진 LINQ to AD 항목을 수행 할 수 없으며 ActiveDirectory 용 DirectoryServices의 새 비트에 액세스 할 수 없습니다.

답변

2

CN이 반드시 그룹 이름과 같을 필요는 없습니다. DN을 이스케이프 처리하므로 DN에서 파싱하는 것은 좋지 않습니다. 개체에 대한 디렉터리를 쿼리해야합니다.

단일 개체를 검색하려면 검색 이름을 고유 이름으로, 검색 범위를 "base"로 설정하고 쿼리를 실행하십시오.

동일한 LDAP 쿼리를 두 번 이상 발행하지 않는 것이 좋습니다 (동일한 행에 두 개 이상의 객체가 memberOf 인 경우). (약간 수정 right off the MSDN)

샘플 코드 :

string dn = "LDAP://CN=Group Name,ON=Groups,DC=fabrikam,DC=com"; 

// Bind to a specific group. 
DirectoryEntry entry = new DirectoryEntry(dn); 

// Create a DirectorySearcher object. 
DirectorySearcher mySearcher = new DirectorySearcher(entry); 
mySearcher.SearchScope = SearchScope.Base; 
mySearcher.PropertiesToLoad.Add("displayName"); 

// Use the FindOne method to find the group object. 
SearchResult resEnt = mySearcher.FindOne(); 
0

불행히도 .NET 2.0에는 더 나은 방법이 없습니다. memberOf 특성에는 사용자가 속한 모든 그룹의 전체 고유 이름이 포함되므로 각 고유 이름을 구문 분석하는 것이 가장 좋습니다.

0

는 "관련"절에있는이 오래된 스레드를 발견.

이 질문에 대한 다른 두 가지 제안 사항이 있습니다.
각각 하나의 검색에서 memberOf 속성의 객체를 SearchResult으로 직접 가져올 수 있습니다.

모든 코드는 C# 형식입니다.

범위 쿼리 (ASQ) 속성 :

DirectoryEntry userEntry = new DirectoryEntry("LDAP://<server>/<user DN>", "user", "pwd"); 

DirectorySearcher searcher = new DirectorySearcher(userEntry); 
searcher.SearchScope = SearchScope.Base; 
searcher.AttributeScopeQuery = "memberOf"; 
searcher.PropertiesToLoad.Clear(); 
// just load any attributes you want, not limited to cn 
searcher.PropertiesToLoad.Add("cn"); 

foreach (SearchResult result in searcher.FindAll()) 
{ 
    Console.WriteLine(result.Path); 
} 

제한 :

  • 2003 (잊어 도메인/숲)의 기능 요구 레벨 차 그룹 구성원을 취급하지 마십시오
  • ASQ가 도메인 전체에서 작동하지 않습니다 (적어도 시스템).주요 그룹 구성원
  • 을 취급하지 마십시오

    • :

      DirectoryEntry rootEntry = new DirectoryEntry("GC://<GC server>", "user", "pwd"); 
      
      DirectorySearcher searcher = new DirectorySearcher(rootEntry); 
      searcher.SearchScope = SearchScope.Subtree; 
      searcher.Filter = "(member:1.2.840.113556.1.4.1941:=<user DN>)"; 
      searcher.PropertiesToLoad.Clear(); 
      // just load any attributes you want, not limited to cn 
      searcher.PropertiesToLoad.Add("cn"); 
      
      foreach (SearchResult result in searcher.FindAll()) 
      { 
          Console.WriteLine(result.Path); 
      } 
      

      제한 : DirectoryServices, 그것은 다른 도메인에있는 모든 개체)

    LDAP_MATCHING_RULE_IN_CHAIN ​​매칭 규칙에 대한 예외가 발생합니다 수 없습니다

  • 2008 R2의 기능 수준 필요 (도메인/포리스트 분실)
  • 구성원 수준이 1 개뿐 아니라 중첩 된 그룹 구성원이됩니다.
관련 문제