2010-07-07 3 views
6

사용자 목록과 활성 디렉터리 그룹 내에서 사용자에 대한 일부 속성을 가져 오려고합니다. 그것은 아주 비효율적으로 보이지만,특정 Active Directory 메일 그룹의 사용자 목록

Dim adGroup As New DirectoryEntry("LDAP://CN=MyGroup,OU=Groups,OU=Accounts,OU=All,DC=domain,DC=com") 
    Dim adMembers As Object 
    Dim objUser As ActiveDirectoryUser 
    Dim objUserList As New List(Of ActiveDirectoryUser) 
    Dim directoryEntry As DirectoryEntry 

    adMembers = adGroup.Invoke("Members", Nothing) 

    For Each adMember As Object In CType(adMembers, IEnumerable) 
     directoryEntry = New DirectoryEntry(adMember) 
     objUser = New ActiveDirectoryUser 

     objUser.UserId = directoryEntry.Properties.Item("sAMAccountName").Value.ToString() 
     objUser.Contract = directoryEntry.Properties.Item("ou").Value.ToString() 
     objUser.LastName = directoryEntry.Properties.Item("sn").Value.ToString() 
     objUser.FirstName = directoryEntry.Properties.Item("givenName").Value.ToString() 
     objUser.Email = directoryEntry.Properties.Item("mail").Value.ToString() 

     objUserList.Add(objUser) 
    Next 

첫 번째 조각이 작동합니다

가 업데이트 : 여기

내가 현재 가지고있는 두 가지 방법이 있습니다. 내 메모리 사용량 올라 타고 등반하고 올라간다 this 오류가 발생했습니다, 그것은 고칠 수있는 것처럼 보이지만. 두 번째 방법은 :

Dim results As SearchResultCollection 
    Dim directoryEntry2 As New DirectoryEntry("LDAP://DC=domain,DC=com") 
    Dim directorySearcher As New DirectorySearcher(directoryEntry2) 
    directorySearcher.PageSize = 1000 

    directorySearcher.Filter = "(&(objectCategory=person)" & _ 
          "(objectClass=user)" & _ 
          "(memberOf=CN=MyGroup,OU=Groups,OU=Accounts,OU=All,DC=domain,DC=com))" 


    directorySearcher.PropertiesToLoad.Add("ou") 
    directorySearcher.PropertiesToLoad.Add("sn") 
    directorySearcher.PropertiesToLoad.Add("givenName") 
    directorySearcher.PropertiesToLoad.Add("sAMAccountName") 
    directorySearcher.PropertiesToLoad.Add("mail") 

    results = directorySearcher.FindAll 

결과 카운트 I 홀수 검색 애플리케이션을 실행할 때마다 다를 것으로 보인다. 이것이 사용자를 되 찾을 수있는 확실한 방법인지 아니면 내 검색에서 무언가를 수정해야하는지 잘 모르겠습니다.

답변

14

당신이 .NET 3.5로 업그레이드하고 많은 새를 사용 할 수 있다면 향상된 System.DirectoryServices.AccountManagement 네임 스페이스. 새로운 수업을위한 훌륭한 소개는 Managing Directory Security Principals in the .NET Framework 3.5에서 찾을 수 있습니다. 이와

, 당신의 작업은 단순하게 :

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"); 
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "MyGroup"); 
PrincipalSearchResult<Principal> members = group.GetMembers(); 

당신을 위해 그 일을합니까?

.NET 3.5를 사용할 수없는 경우 그룹의 member 속성을 검사해야합니다. 그룹 구성원은 이 아니며 을 사용하여 찾을 수 없으므로이 하위 그룹으로 계층 적으로 그룹 아래에 논리적으로 저장됩니다.

DirectoryEntry group = new DirectoryEntry("LDAP://CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com"); 

foreach(object groupMemberDN in group.Properties["member"]) 
{ 
    // grab the group member's DN 
} 

이 조각 더에 대한 MSDN 라이브러리의 Active Directory (또는 Visual Basic .NET에 대해 동일)에 대한 Quick List of C# Code Examples를 참조하십시오.

업데이트하십시오 memberOf 속성 상당이있는 모든 사용자 검색 : 당신이 (당신이 그들의 속성이나 무언가를 업데이트 할 때문에) 특정 그룹에 속하는 사용자 필요한 경우, 당신은 접근 방식을 반전 할 수 그룹의 DN :

DirectoryEntry root = new DirectoryEntry("LDAP://dc=domain,dc=com"); 
DirectorySearcher searcher = new DirectorySearcher(root); 

searcher.Filter = "(&(objectCategory=user)(memberOf=CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com))"; 
// set other properties on the searcher 

foreach(object result in searcher.FindAll()) 
{ 
    // do whatever you need to do with the entry 
} 
+0

멤버 속성을 반복하면 나에게 가까워졌습니다. 필자는 여전히 멤버 개체에서 속성을 가져와야합니다 (이름, 전자 메일 등). 귀하의 예제에서 groupmemberDN을 특정 객체 유형으로 형변환하여 속성을 가져올 수 있다고 가정합니다. –

+0

지금까지 도와 주셔서 감사합니다. 두 가지 질문이 있습니다. 첫째, 당신은 디렉토리 검색자를 사용하여 회원을 얻을 수 없다고 말했으므로, 업데이트 된 예제에서 나는 할 수 있음을 알았습니다. 그래서 당신이 그곳에서 의미하는 것을 당신이 정교 할 수 있기를 바랬습니다. 둘째, 디렉터리 검색기를 사용하여 결과를 얻을 수 있지만 모음에있는 개수는 내 응용 프로그램을 실행할 때마다 달라질 수 있습니다. 일관성이 있어야합니다 (아무도 현재 그룹에 추가되지 않았습니다). –

+0

@ Ek0nomik : ** 그룹이 ** 열거 할 수있는 광고의 컨테이너가 아니기 때문에 ** 모든 구성원을 찾기 위해 그룹을 열거 할 수 없습니다. 멤버를 자식 객체로 포함하지 않습니다. 그러나 디렉터리 분기를 열거하고 특정 그룹의 구성원 인 모든 사용자를 찾을 수 있습니다. –

2

범위 검색 넓게, 회원들은 어디에 있든지 :

Dim directoryEntry As New DirectoryEntry("LDAP://OU=All,DC=Domain,DC=com") 

필터 그룹 구성원을 기반으로 :

directorySearcher.Filter = "(&(objectCategory=person)" & _ 
          "(objectClass=user)" & _ 
          "(memberOf=CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com))" 
+0

범위를 확장하려면 아마도 directorySearcher.PageSize = 1000을 설정해야합니다. – decompiled

+0

아직 운이 없습니다. 나는 당신이 준 물건을 가져 갔고, 구체적인 가치는 떨어졌지만 결과가 돌아 오지는 않습니다. –

+0

@ Ek0nomik - 내 원래 대답에는 오타가있었습니다. "memberOf"에는 공간이 없다고 생각합니다. – Greg