PowerShell 에서이 AD 필터로 무슨 일이 일어나고 있습니까?


9

나는 최근 에이 답변을 작성 하고 흥미로운 것을 발견했습니다.

get-aduser -filter {-not (description -eq "auto")} | measure-object

get-aduser -filter {description -ne "auto"} | measure-object

동일한 데이터에 대해 실행될 때 첫 번째 명령이 예상 값을 반환하는 두 가지 매우 다른 것을 반환합니다. NULL이 분명히 "auto"와 같지 않더라도 description 필드에 널값을 가진 사용자 는 두 번째 명령에서 일치하는 것으로 리턴 되지 않는 것처럼 보입니다 .

채팅중인 두 사람이 이것을보고 내가 미쳤다는 것을 확인했습니다. 무슨 일이야?


1
Where-object를 통해 파이프를 연결하고 위에서 작동하지 않는 필터를 적용하는 것이 좋습니다. get-aduser -filter *-속성 설명 | ? {$ _. description -ne "자동"} | 측정
Mike

@ 마이크 예, 이는 문제의 것으로 보인다 -ne비교 연산자 내의-Filter 블록 만. 구체적으로, 비교의 입력 값이이면 $null.
jscott

1
좋아요와 좋아요가 비슷하게 작동하는 것 같습니다. {설명- "무언가"와 같은 설명은 작동하지 않지만 {-not 또한 작동하는 것이 평가하는 데 상당히 오래 걸립니다. 부서진 사람처럼 모든 대상을 평가하지는 않습니다.
Mike

@ 마이크 맞습니다. 나는 -notlike원래 이것을 사용하여 이것을 우연히 발견 했지만, -ne내가 원하는 것을 얻지 못한다는 것을 알게 된 후에 전환 했습니다. TBH, 나는 당신이 그것을 언급 할 때까지 그것을 시도조차 잊었 지 만 그것을 재현 할 수도 있습니다.
MDMarra

2
그냥 생각하지만 아마도 PoSH의 -eq/ -ne절은 SQL =/ <>? 처럼 행동하려고합니다 . SQL에서, foo = NULL그리고 foo <> NULL단지 - NULL은 '비교할 수없는'이기 때문에 항상 false를 돌려줍니다 foo IS NULLfoo IS NOT NULL특별 운영자가 작동합니다. 귀하의 경우 동작은 포쉬에 유사해야 -not (foo -eq "bar")필터가 모든 반환 (foo -eq "bar")반환 $false, foo -eq $null할 것입니다. 대신 if (!foo -or foo -ne "bar")(동등한 SQL foo IS NULL OR foo <> 'bar') 어떻습니까?
jimbobmcgee

답변:


4

두 명령의 주요 차이점은 첫 번째 명령은 모든 결과를 얻기 위해 값을 직접 비교하지 않고 두 번째 명령은 그렇지 않습니다. 첫 번째 명령에는 NULL 결과가 포함되고 두 번째 명령에는 MDMarra가 이미 검색 한대로 포함되지 않습니다. 두 명령 모두이 cmdlet으로 시작합니다.

get-aduser

아래를 진행할 때이 cmdlet의 결과에는 -filter매개 변수의 다른 항목에 관계없이 모든 AD 사용자가 포함 됩니다.

이제 다른 두 부분을 나누어 봅시다. 첫번째:

{-not (description -eq "auto")}

...방법

  1. "description 속성 텍스트 문자열"auto " 와 같은 위치를 파악합니다 .이 비교가 작동하려면 -eq연산자가"auto "와 비교할 수 있도록 설명 필드에 문자열이 존재해야합니다 . NULL 값은 여기에서 삭제됩니다. NULL을 문자열 값과 비교할 수 없으므로 비교하십시오.
  2. 독립적으로 -eqfilter 매개 변수 는 결과가 아닌 모든 것을 제공 (description -eq "auto")합니다. 원래 cmdlet get-aduser에는 모든 AD 사용자가 포함 되므로 NULL이 포함됩니다 . -not운영자 와 다른 것을 비교할 필요가 없었습니다 . (description -eq "auto")필터 결과 이외의 모든 정보 를 제공했습니다.

귀하의 예에서 설명이 "auto", "auto"이외의 것으로 몇 백, NULL 설명이있는 몇 백 명의 AD 사용자가 있다고 가정합니다. 명령 논리를 단계별로 수행하면 다음이 수행됩니다.

  1. 설명이 "auto"인 모든 AD 사용자 (get-aduser)를 지정하십시오. 결과는 1 명의 사용자입니다.
  2. 방금 나에게 준 것이 아닌 모든 AD 사용자를 줘라. 결과는 다른 것을 가진 수백 명과 NULL을 가진 수백 명이다.

-not연산자를 사용하여 다른 항목과 비교할 필요가 없으므로 원래 get-adusercmdlet 에서 캡처 된 NULL 설명 사용자가 결과에 포함되었습니다 .

두 번째 명령 :

{description -ne "auto"}

...방법

  1. "description 속성 정확한 문자열"auto "와 다른 위치를 파악하십시오. 다시이 비교가 작동하려면 -ne연산자가"auto "와 비교할 수 있도록 설명 필드에 문자열이 존재해야합니다 . NULL 값 NULL을 문자열 값과 비교할 수 없으므로이 비교에서 삭제됩니다.

이 예에서는 설명이 "auto", "auto"이외의 다른 것의 수백, NULL 설명의 수백 명의 AD 사용자가 있다고 가정합니다. 명령 논리를 단계별로 수행하면 다음이 수행됩니다.

  1. 설명이 "auto"가 아닌 모든 AD 사용자에게 알려주십시오. 설명에 "auto"이외의 다른 이름을 가진 수백 명의 사용자가 생깁니다. NULL을 텍스트 문자열과 비교할 수 없기 때문에 NULL 설명으로 사용자를 끌어 들이지 않습니다.

어느 쪽이든 두 명령의 전체 차이점은 직관적이지 않습니다.

이 명령을 사용하면 다음과 같이 "-and"로 NULL을 잡을 수 있습니다.

{description -ne "auto" -and description -ne $NULL}

나는 지금 그것을 테스트 할 수 없기 때문에 구문에 100 %가 아니며 아마도 이것보다 더 좋은 방법이있을 것입니다. 모든 것이 분류되면 상당히 반 기후 적이며 설명하기 위해 많은 타이핑이 필요했지만 모든 연산자를 사용하기 전에 이와 같은 이상한 일이 발생했습니다. 모든 경고를 기억할 수 없기 때문에 많은 시행 착오를 겪었습니다 그것은 각각을 사용하는 것과 함께 진행됩니다.

참조 : http://technet.microsoft.com/en-us/library/hh847732.aspx :

비교 연산자

비교 연산자 (-eq, -ne, -gt, -lt, -le, -ge)를 사용하여 값과 테스트 조건을 비교하십시오. 예를 들어 두 문자열 값을 비교하여 값이 같은지 확인할 수 있습니다.

비교 연산자에는 정규 표현식을 사용하여 패턴을 찾는 일치 연산자 (-match, -notmatch)가 포함됩니다. 정규 표현식을 사용하여 입력 값을 변경하는 replace 연산자 (-replace); 와일드 카드 문자 (*)를 사용하여 패턴을 찾는 like 연산자 (-like, -notlike); 테스트 값이 참조 세트에 나타나는지 여부를 결정하는 포함 연산자 (in, -notin, -contains, -notcontains).

또한 비트 패턴 (-bAND, -bOR, -bXOR, -bNOT)을 포함하여 값의 비트 패턴을 조작합니다.

자세한 내용은 about_Comparison_Operators를 참조하십시오.

논리 연산자

논리 연산자 (-and, -or, -xor, -not,!)를 사용하여 조건문을 단일 복합 조건부로 연결하십시오 . 예를 들어, 논리 연산자를 사용하여 두 가지 조건이있는 객체 필터를 만들 수 있습니다.

자세한 내용은 about_Logical_Operators를 참조하십시오.


확실한 개요이지만 왜 -ne 및 -notlike 연산자에서 null 값이 제외됩니까? 이것이 진짜 머리 긁는 도구입니다. 의도적으로 난해한 .net 사양 설명이 있거나 버그 또는 예기치 않은 동작인지 궁금합니다.
MDMarra

잠깐만 더 자세히 읽으십시오. 문자열 만 비교하고 null 속성은 실제로 null이며 빈 문자열이 아닙니다. 직관적이지 않은 경우 흥미 롭습니다.
MDMarra

0

검색 할 때이 오래된 질문에 추가 :

-ne 또는 -notlike와 같이 음수가 일치하는 -Filter를 사용하면 빈 null 값이있는 결과가 제외됩니다. 이들을 포함 시키려면 -notlike '*'-eq ''-eq $ NULL 이 유효한 필터가 아니므 로 명시 적으로 일치시켜야 합니다. 이것은 직접 -LdapFilter DOES 부정 일치 빈 값을 사용하는 -Filter의 단점입니다.

음수를 사용한 다중 일치의 필터 및 LdapFilter 예는 다음과 같습니다.

Get-ADUser -Filter { mail -like '*example*' -and (description -ne 'example' -or description -notlike '*') }

Get-ADUser -LdapFilter '(&(mail=*example*)(!description=example))'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.