2012-09-10 3 views
2

특정 OU의 멤버가 포함 된 모든 그룹의 목록을 만들려고합니다. 이렇게하려면 모든 그룹 이름 목록이있는 파일을 읽고 get-ADGroupMember $ groupName을 사용하여 각 그룹의 구성원을 찾습니다. 각 멤버의 값을 문자열로 변환하고 $ member.indexOf ("특정 OU")와 비교합니다. 문제는 $ member [$ i] .indexOf ("특정 OU")를 얻는 방법을 찾지 못했기 때문입니다. 내 코드는 아래와 같습니다.Powershell에서 Active Directory 그룹 구성원을 반복하는 방법

EDIT : for-each 루프를 사용하면 멤버를 제대로 순환 할 수 있지만 중복을 방지하는 break는 사용할 수 없습니다.

Import-Module ActiveDirectory 
#declaring end result group array 
$results = @() 

#sets path for files 
$pathName = $MyInvocation.MyCommand.Path 
$pathLen = $pathName.LastIndexOf("\") 
$pathStr = $PathName.Substring(0,$pathLen +1) 
$APgroupFile = $pathStr + "APGroups.csv" 
$groupFile = $pathStr + "GGroups.csv" 

#gets the list of group names and loops through them 
get-content $groupFile | foreach-object{ 
#sets all of the group names 
#start of if1 
if($_.IndexOf("CN=") -ge 0){ 
$nameStart = $_.IndexOf("CN=")+3 
$nameEnd = $_.indexOf(",")-$nameStart 
$name = $_.substring($nameStart, $nameEnd) 

#issue starts here 
#goal is to find member of "specific OU". 
#If found, add group to $results. If not, go to next group 
$members = get-ADGroupMember -Identity $name 
if($members.length -gt 0){ 
$i=0 
for($i=0; $i -le ($members.length -1); $i++){ 
#need to check users OU for specific OU. If a user is member, save group to .txt. If none are members, move to next group 
    $OU = $members.toString() 
    if($OU.indexOf("OU=specific OU") -ge 0){#start of if OU 
    $results += New-Object psObject -Property @{'GroupName'=$name; 'Member'=$OU} 
    break 
    }#end if OU 
    }#end for mem.length 
}#end if mem.length 
}#end if1 
}#end foreach 

$results | Export-Csv $APgroupFile -NoTypeInformation 

답변

4

이 시도 :

Get-ADGroupMember -Identity $name | 
Where-Object {$_.distinguishedName -like '*OU=specific OU*'} 
+0

이것은 처음 테스트 한 후에 작동하는 것으로 보입니다. 너 훌륭해. 감사. – spassen

+1

감사합니다. -Recursive 스위치를 추가하여 중첩 된 멤버쉽을 얻을 수도 있습니다. –

0

명시 적으로 언급하지 않았다 고려를 : 어떤 중첩 된 OU에 대해? 즉, 대상 OU에서 즉시 멤버 만 고려하고 있습니까? 또는 OU의 구성원이 논리적으로 귀하의 목적에 따라 2 ~ 3 단계로 포함될 것입니까? 예 : '캘리포니아'가 타겟 조직 단위 인 경우 캘리포니아 아래에있는 객체 만 원하나요? 또는 샌프란시스코의 모든 구성원과 샌디에고의 모든 구성원 (캘리포니아의 하위 OU)을 결과 집합에 포함 시키시겠습니까? 어느 쪽이든 :

Get-ADUser includes search and filter capability - http://technet.microsoft.com/en-us/library/ee617241

Get-ADuser -Filter {sAMAccountName -eq "jdoe"} -SearchBase "OU=IS,DC=foodomain,DC=com" -SearchScope SubTree 

    Get-ADuser -Filter {sAMAccountName -eq "jdoe"} -SearchBase "OU=IS,DC=foodomain,DC=com" -SearchScope OneLevel 

그래서 여기에 방법은 대상 사용자, 각 사용자에 대해 별도의 검색 대상 OU를 검색하는 것입니다. 반환 된 결과 집합에서 해당 사용자를 얻는 지 여부를 결정합니다. 그것은 당신이 테스트하는 조건이 될 수 있습니다. 분명히 "jdoe"를 적절한 변수로 대체하려고합니다 ($ members [i] .SamAccountName이 트릭을 수행 할 것이라고 생각합니다).


그냥 셰이 레비의 대답을 보았습니다. 훨씬 간결하고 좋은 직장. 명시 적 검색 기반이 없으면 다른 상위 OU에 포함 된 동일한 이름의 컨테이너를 방문하게 될 수도 있지만 결과 집합은 동일해야합니다. 예를 들어 모든 도시에 표준 '사무실 직원'OU가 포함되어있는 경우 각각은 'OU = 사무실 직원'표현으로 검색됩니다. 두 가지 접근 방식을 모두 시도하고 성능 차이를 테스트 할 수 있습니다. 그것이 평등하다는 셰이 레비 (Shay Levy)는 더 즐겁게 읽습니다.

관련 문제