Powershell을 사용하여 Active Directory에서 일부 정보를 가져오려고 하는데 이상한 동작이 발생합니다. 내 스크립트는 다음과 같습니다.
$toFind = ( 'bobjones', 'samsmith' )
filter Get-AdUser {
$strFilter = "(&(objectCategory=User)(sAMAccountName=$_))"
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$colProplist = ("name", "department")
foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}
($objSearcher.FindAll() | %{$_.Properties})
}
"paul" | get-aduser # Works
$toFind | get-aduser # Doesn't work?!
전자는 내가 기대하는 속성 테이블을 인쇄합니다. 후자는 왜 그런지 잘 모르겠지만 "0 1"을 반복적으로 인쇄하게 됩니다. 단일 케이스는 작동하지만 어레이는 작동하지 않는 이유는 무엇입니까?
답변1
전체 포리스트를 검색하려고 하므로 글로벌 카탈로그를 쿼리하려고 합니다. 몇 가지 접근 방식이 있지만 가장 간단한 방법은 검색 루트를 GC로 변경하는 것입니다. 예를 들어
$objSearcher.SearchRoot = [ADSI]"GC://$($objDomain.Name)"
또는 포리스트를 쿼리한 다음 글로벌 카탈로그 목록을 요청하고 그 중 하나를 초기 디렉터리 항목으로 사용할 수 있지만 이는 검색 중인 필드가 GC에 있는 경우 원하는 작업을 수행할 만큼 충분히 간단한 변경입니다. 기본적으로 전역인 사용자 이름으로 검색하므로 검색 부분은 문제가 되지 않습니다. 그러나 부서는 기본적으로 전역이 아니기 때문에 검색 결과 결과에서 부서 필드를 다시 가져올 수 없습니다. 이를 얻으려면 검색 결과에서 고유 이름을 사용하여 전체 AD 사용자 개체에 대한 사용자 도메인에 대한 후속 AD 조회를 수행한 다음 부서를 가져와야 합니다. 부서가 글로벌하도록 스키마를 변경할 수 있지만 이는 다소 급진적인 IMO입니다.
전체 목록을 찾을 수 있습니다.여기에 기본 전역 속성이 있습니다.
답변2
foreach ($user in $toFind) { get-aduser $user }와 같은 foreach 루프를 지정해야 할 수도 있습니다.
프롬프트에 $toFind만 입력하면 어떻게 되나요? 나는 그것이 한 줄에 하나씩 두 이름을 모두 나열한다고 가정합니다.
내 AD에 대해 동일한 코드를 실행해 보았고 다음과 같은 결과를 얻었습니다.
이름 값 ---- ----- 이름 {Sahnti L. Aphil} Adspath {LDAP://CN=Sahnti L. Aphil,OU=Users,OU=Jackson,DC=company,DC=local} 0 1 이름 {하몽저스티스} 광고경로 {LDAP://CN=하몽저스티스,OU=Users,OU=Jackson,DC=company,DC=local}
답변3
참고 사항: Quest AD cmdlet 패키지(http://www.quest.com/powershell/activeroles-server.aspx) 모든 AD 관련 powershell 항목에 대해 설명합니다. Powershell에 내장된 AD 지원이 매우 형편없기 때문에 구멍을 메웁니다. 개발 시간을 많이 절약할 수 있습니다.
답변4
참고로, 0과 1의 출력을 얻는 이유는 $objSearcher.PropertiesToLoad.Add()에 대한 호출이 추가된 속성의 인덱스(첫 번째 속성의 경우 0, 두 번째 속성의 경우 1)를 반환하기 때문입니다. 이는 스크립트의 각 사용자에 대해 한 번씩 발생합니다. Out-Null로 파이프하여 반환 값을 억제할 수 있습니다.