2014-03-12 2 views
1

Microsoft Active Directory 및 Unboundid SDK를 사용하며 29k 멤버가 많은 그룹이 있습니다.Large AD 그룹의 모든 구성원 검색

범위 값을 사용하여 모든 그룹을 얻으려고하지만 끝날 때를 결정할 수 없습니다. (작업 코드로 업데이트)

public static List<String> getAttributeRangeBasedSearch(LDAPConnection ldc, String basedn, String filter, int step, String return_attribute) throws LDAPException 
{ 
List<String> allValues = new ArrayList<String>(); 
// initialize counter to total the group members and range values 
int allvalues = 0; 
int start = 0; 
// int step = 1000; 
int finish = step - 1; 
boolean finallyFinished = false; 
String range; 
// loop through the query until we have all the results 
while (!finallyFinished) 
{ 
    range = start + "-" + finish; 
    String currentRange = return_attribute + ";Range=" + range; 
    String range_returnedAtts[] = { currentRange }; 
    SearchRequest searchRequest = new SearchRequest(basedn, SearchScope.BASE, filter, range_returnedAtts); 
    List<SearchResultEntry> rangedEntries = ldc.search(searchRequest).getSearchEntries(); 
    for (Iterator<SearchResultEntry> iterator = rangedEntries.iterator(); iterator.hasNext();) 
    { 
    SearchResultEntry searchResultEntry = iterator.next(); 
    Collection<Attribute> allAttribute = searchResultEntry.getAttributes(); 
    for (Iterator<Attribute> attributeIterator = allAttribute.iterator(); attributeIterator.hasNext();) 
    { 
     Attribute attribute = attributeIterator.next(); 
     log.debug("---> " + allvalues + ": " + attribute.getName()); 
     if (attribute.getName().endsWith("*")) 
     { 
     currentRange = attribute.getName(); 
     finallyFinished = true; 
     } 
     String[] attributeBatch = searchResultEntry.getAttributeValues(currentRange); 
     for (int i = 0; i < attributeBatch.length; i++) 
     { 
     allValues.add(attributeBatch[i]); 
     log.debug("-- " + allvalues++ + " " + attribute.getName() + ":" + attributeBatch[i]); 
     } 
    } 

    }// for SearchResultEntry 
    start = start + step; 
    finish = finish + step; 
}// finallyFinished 
return allValues; 
} 

어떤 아이디어 :

나는이 방법을 사용하고 있습니다?

감사합니다 - 짐

+0

AD, 기본적으로 전용 특성 당 5000 개 항목의 최대 저장; 더 많은 속성이 여러 개의 "덩어리"(예 :'member0-4999;'member5000-9999;'등)로 나뉘어지면 전체 목록을 얻기 위해 이들을 병합 할 수 있습니까? 선택적으로, memberOf 속성에 그룹의 고유 이름이 포함 된 모든 사용자를 묻는 페이지 단위 검색을 수행 할 수 있지만 이전 방법과 비교할 때 속도가 느립니다. –

+0

문제는 항목이 아니라이 인스턴스의 MaxValRange에 의해 결정되는 값으로 각 속성에 대해 1,500입니다. 나는 모든 결과를 얻고있다. 그러나 나는 마지막 값 집합을 구할 때 member28131과 같은 부분 크기이다 - ????? 어떤 가치에 나는 무엇을 전혀 모른다. 그렇다면 각 결과 내에서 범위의 반환 값을 어떻게 말할까요? 감사합니다 -jim – jwilleke

+0

사실 이제는 세미콜론이 특성 이름 바로 뒤에 있다는 것을 기억합니다. 검색된 모든 특성을 반복하고 세미콜론에 이름을 분할하고 동일한 이름의 특성을 함께 병합합니다. –

답변

2

나는이 동적으로 하드 코딩에 그는 formt 1500의 기본을 변경 될 수 있습니다 사물이 작동하지만 프로세스가 매우 어렵 현재 내가 단계에 대한 하드 코딩 된 값을 사용하고있어 제한은 5,000입니다.

동적으로 값을 결정할 수 없었습니다. Appears, maybe, CN = 쿼리 정책, CN = 디렉터리 서비스, CN = Windows NT, CN = 서비스, CN = 구성, 포리스트 루트가 정의되지 않은 경우 다음 기본값에 따라 기본값이 달라야합니다. 어떤 버전의 Microsoft Active Directory가 사용되고 있는지 확인하십시오.

도울 수있는 정보는 some sort of control 인 MSDN에도 설명되어 있지만 사용 방법에 대한 정보는 없습니다. 누구도 이것을 사용합니까?

+0

이 DN은 정확합니다. ADLDS의 경우 DN은'CN = 기본 쿼리 정책, CN = 쿼리 정책, CN = 디렉터리 서비스, CN = Windows NT, CN = 서비스, CN = 구성, CN = xxxxxxxxxxx'입니다. 속성은 값이 'MaxValRange = 5000' 인'lDAPAdminLimits'입니다. 번호는 조정 가능합니다. – bgStack15

0

이 파일은 텍스트 파일에서 원하는 수만큼 검색하여 저장할 수 있습니다. 그룹이 비어있는 경우 또한 그것은 무한 루프에 완료되지 않습니다

$myGroup = [string]$args[0]; 
$myGroup = $myGroup.replace(" ",","); 
$group = [adsi]("LDAP://$($myGroup)"); 
$from = 0 
$all = $false 

$members = @() 


while (! $all) { 
    trap{$script:all = $True;continue} 
    $to = $from + 999 
    $DS = New-Object DirectoryServices.DirectorySearcher($Group,"(objectClass=*)","member;range=$from-$to",'Base') 
    $members += $ds.findall() | foreach {$_.properties | foreach {$_.item($_.PropertyNames -like 'member;*')}} 
    if($from -gt $members.count){ 
     break; 
    } 
    $from += 1000 
} 

$currentExecuting = (Get-Item $MyInvocation.MyCommand.Path) 
$group.sAMAccountName 
$members | measure-object 

$members > "$($currentExecuting.Directory)\$($group.sAMAccountName).txt" 

사용 :

getADGroupMembers.ps1 CN=groupName,OU=myOrgUnit,DC=contoso,DC=com 
관련 문제