PowerShell의 System.DirectoryServices.ResultPropertyCollection 이해하기

PowerShell과 Active Directory를 쿼리할 때 System.DirectoryServices.ResultPropertyCollection에서 속성에 접근하려고 할 때 몇 가지 혼란스러운 동작을 경험할 수 있습니다. 이 글에서는 DirectorySearcher를 통해 정보를 가져올 때 발생하는 일반적인 문제를 해결하고, 특히 두 가지 다른 결과가 예상치 못한 결과를 초래하는 이유를 살펴보겠습니다. 문제의 본질과 해결 방법을 탐구해 봅시다.

문제

Active Directory에서 컴퓨터 객체를 찾기 위해 DirectorySearcher 클래스를 사용하는 PowerShell 스크립트를 설정했지만 출력에 불일치가 발생하고 있습니다. 다음은 여러분의 코드를 간단히 복제한 것입니다:

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher  
$objSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry  
$objSearcher.Filter = ("(objectclass=computer)")  
$computers = $objSearcher.findall()  

컴퓨터의 이름을 출력하려고 할 때, 다음과 같은 두 가지 출력을 관찰하게 됩니다:

$computers | %{
    "Server name in quotes $_.properties.name" 
    "Server name not in quotes " + $_.properties.name 
}

그리고 나서:

$computers[0] | %{"$_.properties.name"; $_.properties.name}

결과는 따옴표로 감싸진 경우에는 속성에 대해 유형 이름(System.DirectoryServices.SearchResult.properties.name)을 나타내지만, 따옴표 없이 사용할 경우에는 값을 보여줍니다. 이 뉘앙스를 이해하는 것이 PowerShell에서 속성 검색을 마스터하는 데 중요합니다.

출력이 다른 이유는 무엇인가요?

불일치는 PowerShell이 문자열 내에서 변수와 속성을 평가하는 방식에서 발생합니다. 문자열에 $_를 포함시키면 PowerShell은 이를 전체 객체로 간주합니다:

  • 따옴표 컨텍스트: "Server name in quotes $_.properties.name"와 같이 문자열에 ";"를 사용할 때, PowerShell은 속성을 평가하지 않고 객체의 ToString 메소드를 참조합니다. 이 경우, 기본적으로 속성의 유형 이름이 반환됩니다.

  • 비따옴표 컨텍스트: 반대로, "Server name not in quotes " + $_.properties.name와 같이 따옴표 없이 사용할 경우, PowerShell은 먼저 속성을 평가한 다음, 이를 문자열에 연결합니다. 따라서 속성에 저장된 실제 값을 가져오게 되며, 유형 이름이 아니라 값이 출력됩니다.

출력을 수정하기

따옴표 문자열 안에서 의도한 속성 값을 가져오기 위해서는 서브 표현식 문법을 사용하여 명시적으로 평가를 호출할 수 있습니다:

"Server name in quotes $($_.properties.name)"  

$() 사용은 PowerShell에 내부의 내용을 먼저 평가하도록 지시하여, 예상한 올바른 출력을 얻을 수 있도록 합니다.

결과 속성 컬렉션 탐색하기

ResultPropertyCollection 작업 시 속성 컬렉션을 다루고 있음을 기억하세요. PowerShell 명령줄에서 객체 모델을 직접 탐색할 수 있습니다. 예를 들어 $computers[0].propertiesGet-Member로 파이핑하면 사용 가능한 멤버 및 속성에 대한 정보를 확인할 수 있습니다:

$computers[0].properties | Get-Member

Values 속성은 속성의 값을 포함하는 ICollection을 검색합니다. 이 탐색은 여러분의 이해도를 높이고 속성을 더 효과적으로 탐색할 수 있도록 돕습니다.

결론

PowerShell과 Active Directory의 System.DirectoryServices 작업 시, 문자열 평가가 객체와 그 속성에 어떻게 작용하는지를 이해하는 것이 중요합니다. 이러한 속성에 접근하는 다양한 컨텍스트를 인식함으로써 혼란을 피하고 기대하는 형식으로 필요한 정보를 검색할 수 있습니다.

ResultPropertyCollection과 같은 복잡한 PowerShell 구조를 탐색하는 것은 처음에는 부담스럽게 느껴질 수 있지만, 연습과 깊이 있는 이해를 통해 스크립팅 여정에서 자연스러워질 것입니다.