파워쉘을 사용하여 Active Directory를 쿼리할 때 가장 흔한 문제 중 하나는 필터 구문을 올바르게 작성하는 방법입니다. ActiveDirectory PowerShell 모듈 cmdlet의 Filter
및 LDAP Filter 매개변수는 많은 사람들에게 불투명한 상태입니다.
이 블로그 포스트에서는 Active Directory 필터를 사용하는 방법에 대해 자세히 알아보겠습니다. 이 글을 읽고 나면 더 이상 Where-Object
와 같은 것을 사용하려 하지 않을 것입니다!
전제 조건
제가 보여줄 코드 중 어떤 것이든 작동하려면 다음을 가정합니다:
- PowerShell ActiveDirectory 모듈이 설치되어 있다고 가정합니다.
- 도메인에 가입된 컴퓨터에 있습니다.
- AD 도메인 컨트롤러에 성공적으로 연결하고 인증할 수 있습니다.
Active Directory cmdlet 중 많은 개체를 검색할 때 사용할 수 있는 두 가지 다른 필터 언어가 있습니다: PowerShell 필터 및 LDAP 필터.
PowerShell 필터
PowerShell 필터는 표준 PowerShell 식 구문을 사용합니다. 이는 일반적으로 Active Directory 검색 필터 구문이라고도 합니다.
이러한 필터는 Filter
매개변수와 함께 사용됩니다. Filter
매개변수 구문
연산자
Filter
매개변수를 만들 때, 적어도 하나의 연산자를 사용해야 합니다. 여기서 사용된 연산자들은 Where-Object
와 같은 명령어를 사용할 때 익숙한 연산자들입니다.
Filter
매개변수 내에서는 다음과 같은 연산자를 사용할 수 있습니다.
Operator | Explanation |
---|---|
-eq | Equal to |
-le | Less than or equal to |
-ge | Greater than or equal to |
-ne | Not equal to |
-lt | Less than |
-gt | Greater than |
-approx | Approximately equal to |
-bor | Bitwise OR |
-band | Bitwise AND |
-recursivematch | Recursive match |
-like | Like |
-notlike | Not like |
-and | Boolean AND |
-or | Boolean OR |
-not | Boolean NOT |
AD 개체 속성 참조
필터 내에서는 연산자를 사용하여 다양한 AD 개체 속성을 비교합니다. 예를 들어, Get-AdUser
cmdlet은 Name
속성을 반환합니다. 특정 이름과 일치하는 모든 사용자를 찾고 싶다면 다음과 같이 사용합니다:
속성 이름은 AD cmdlet과 함께 반환된 속성의 이름 또는 LDAP 필터 이름일 수 있습니다.
속성 값은 일반적으로 작은따옴표나 큰따옴표로 묶입니다. 유일하게 허용되는 와일드카드는 별표(*)입니다. 위의 예시에서 필터는 큰따옴표로 둘러싸여 있지만 Adam Bertram은 작은따옴표로 둘러싸여 있음을 볼 수 있습니다.
일부 문자는 필터에서 사용할 때 ‘이스케이프’ 처리해야 합니다. 이러한 문자들은 다음과 같습니다:
Character | Escaped As | Notes |
---|---|---|
“ | `” | Only required if the data is enclosed in double quotes. |
‘ | \’ | Only required if the data is enclosed in single quotes. |
NUL | \00 | This is a standard LDAP escape sequence. |
\ | \5c | This is a standard LDAP escape sequence. |
* | \2a | Automatically escaped. Only in -eq and -ne comparisons. You should use -like and -notlike operators for wildcard comparison. |
( | /28 | Automatically escaped. |
) | /29 | Automatically escaped. |
/ | /2f | Automatically escaped. |
Active Directory LDAP란 무엇인가요?
LDAP 또는 Lightweight Directory Access Protocol은 디렉터리 데이터에 액세스하고 수정하기 위한 벤더 중립적인 프로토콜입니다. 디렉터리라는 단어를 들으면 전화번호부를 떠올릴 수 있지만, Active Directory의 맥락에서는 그 이상의 의미를 갖습니다. Active Directory에는 다양한 객체 유형이 저장되고 접근 가능하게 되며, LDAP 프로토콜은 그 데이터에 액세스하는 수단으로 기능합니다.
Active Directory는 다양한 데이터 유형을 저장할 수 있기 때문에, 애플리케이션 및 사용자는 해당 디렉터리를 쉽게 쿼리할 방법이 필요합니다. 데이터 필터링에 도움이 되는 LDAP 필터에 대해 알아보세요!
LDAP 필터
Active Directory는 Lightweight Directory Access Protocol(LDAP)을 구현합니다. cmdlet과 함께 LDAP 필터(예: Active Directory Users and Computers에서 생성된 필터)를 사용하기 위해 LDAPFilter 매개변수를 사용할 수 있습니다.
LDAP 필터의 구문은 RFC 번호 4515에서 정의되어 있습니다.
각 필터 규칙은 괄호 ( )
로 둘러싸여 있습니다. 필터 규칙은 그룹을 괄호로 둘러싸고 다음 중 하나의 비교자를 포함하여 그룹화할 수 있습니다:
Operator | Function |
---|---|
& | and |
| | or |
! | not |
LDAP 필터에는 특별한 일치 규칙인 개체 식별자(Object Identifiers, OID)도 있습니다:
OID | Purpose |
---|---|
1.2.840.113556.1.4.803 | Bitwise AND |
1.2.840.113556.1.4.804 | Bitwise OR |
1.2.840.113556.1.4.1941 | Chain matching (for distinguished name attributes) |
네 가지 필터 유형이 있습니다:
Operator | Explanation |
---|---|
= | Equal to |
~= | Approximately equal to |
>= | Greater than or equal to |
<= | Less than or equal to |
네 가지 항목 유형이 있습니다:
Type | Explanation |
---|---|
= | Simple |
=* | Present |
=something* | Substring |
Extensible | varies depending on type |
LDAP 필터 규칙은 LDAP 속성 이름과 함께 사용해야 하며, 일부 문자 값은 LDAP 필터에서 ‘이스케이프’ 처리되어야 합니다. 이러한 문자 값은 다음과 같습니다:
Character | Escaped As |
---|---|
* | \2a |
( | \28 |
) | \29 |
\ | \5c |
NUL | \00 |
비교를 위한 속성 값은 일반적으로 따옴표로 감싸지 않아도 됩니다.
LDAP 필터 예제
LDAP 필터를 만드는 것은 도전적일 수 있습니다. 여기에는 기본으로 사용할 수 있는 활성 디렉터리 그룹 필터 예제가 있습니다.
- 이름(cn)이 ‘전문 서비스 부서’인 모든 그룹
'cn -eq "전문 서비스 부서"'
또는 `'(cn=전문 서비스 부서)'
- 이름이 ‘전문 서비스 부서’이고 설명이 ‘실시간’인 모든 그룹
'(cn -eq "전문 서비스 부서") -and (description -eq "실시간")'
또는'(&(cn=전문 서비스 부서)(description=실시간))'
- 이름이 ‘전문 서비스 부서’ 또는 ‘모든 부서 공유 액세스’인 모든 그룹
'(cn -eq "전문 서비스 부서") -or (cn -eq "모든 부서 공유 액세스")'
또는'(|(cn=전문 서비스 부서)(cn=모든 부서 공유 액세스))'
- ‘Live’ 설명을 가지고 있지 않은 모든 그룹. 설명 필드가 전혀 없는 경우
'(!(description=Live))'
- ‘Live’ 설명을 가지고 있지 않은 모든 그룹. 설명 필드가 전혀 없는 경우 제외
'description -ne "Live"'
- ‘Live’ 설명을 가지고 있지만 ‘Professional Services Department’ 이름은 아닌 모든 그룹
'(description -eq "Live") -and (cn -ne "Professional Services Department")'
또는'(&(description=Live)(!(cn=Professional Services Department)))'
- 설명이 ‘\\fileserver1\fileshare’인 모든 그룹
'description -eq "\5c\5cfileserver1\5cfileshare"'
또는'(description=\5c\5cfileserver1\5cfileshare)'
RecursiveMatch 또는 Chain Matching 사용
매칭 규칙 OID를 사용하거나 RecursiveMatch
매개변수는 AD 쿼리에 대해 자주 묻는 질문을 해결하는 강력한 방법입니다: ‘사용자가 직접 및 간접적으로 속한 모든 그룹을 어떻게 알 수 있을까요?’ Active Directory 검색 필터 memberOf
속성을 사용하여 알 수 있습니다.
간단한 LDAP 일치 규칙을 사용하는 것이 큰 스크립트보다 효율적일 수 있습니다. 예를 들어, 우리의 예제 도메인 domain.local에서 Kristin Diaz는 직접 전문 서비스 부서 보안 그룹의 구성원입니다. AD의 memberOf
속성을 살펴보면 이를 확인할 수 있으며, 전문 서비스 부서만 표시됩니다.
일치 규칙 OID 또는 RecursiveMatch
매개변수를 사용하면 간접적으로 모든 부서 공유 액세스의 구성원임을 알 수 있습니다. 이는 전문 서비스 부서 그룹이 모든 부서 공유 액세스의 구성원인 경우입니다.
두 가지 모두 다음을 반환합니다:
SearchBase 및 SearchScope 매개변수
대규모 환경에서 AD에는 많은 수의 개체가 포함될 수 있습니다. 쿼리의 성능을 향상시키고 반환되는 개체 수를 줄이는 한 가지 방법은 검색을 범위로 지정하는 것입니다.
SearchBase
매개변수는 검색이 시작되는 AD 계층 구조의 위치를 결정합니다. cmdlet을 사용할 때 이는 식별 이름의 문자열 표현입니다(기본적으로 도메인의 ‘최상위’입니다). 또한 세 가지 수준의 SearchScope
가 있습니다:
- Base – SearchBase로 지정된 개체입니다.
- OneLevel – SearchBase에 직접 포함된 개체를 검색하지만 하위 컨테이너에는 포함되지 않습니다.
- SubTree – SearchBase에 포함된 개체와 AD 계층 구조를 통해 재귀적으로 모든 하위 컨테이너에 포함된 개체를 검색합니다.

위의 예에서는 SearchBase를 OU=All User Accounts,DC=domain,DC=local로 설정한 경우, SearchScope
가 Base
인 경우 OU 개체 자체를 쿼리하고, SearchScope
가 OneLevel
인 경우 All User Accounts OU만 검색하며, SearchScope
가 SubTree
인 경우 All User Accounts와 Professional Services OU를 모두 검색합니다.
요약
Active Directory PowerShell cmdlet을 사용하여 필터링하는 방법에 대해 이제 잘 이해하고 있을 것입니다. 완벽한 필터 구문을 만드는 것은 어렵지만 Where-Object
cmdlet을 사용하는 것보다는 훨씬 어렵습니다.
하지만 AD 개체를 필터링하는 ‘올바른’ 방법을 배우는 데 시간을 투자하면 우수한 성능과 효율성을 얻을 수 있습니다!