Me hace poco escribí esta respuesta y topé con algo interesante.
get-aduser -filter {-not (description -eq "auto")} | measure-object
y
get-aduser -filter {description -ne "auto"} | measure-object
devuelve dos cosas muy diferentes cuando se ejecuta contra los mismos datos, con el primer comando devolviendo el valor esperado. A primera vista, parece que los usuarios con un valor nulo en el campo de descripción no se devuelven como coincidencias en el segundo comando, aunque NULL claramente no es igual a "auto".
Un par de personas en el chat han mirado esto y verificado que no estoy loco. ¿Que está pasando aqui?
powershell
MDMarra
fuente
fuente

-neoperador de comparación dentro del-Filterbloque solamente. Específicamente, cuando el valor de entrada de la comparación es$null.-notlikeoriginalmente, pero cambié-nedespués de darme cuenta de que no estaba obteniendo lo que quería. TBH, olvidé que incluso lo había intentado hasta que lo mencionaste, pero también puedo reproducirlo.-eq/ PoSH-neintenta comportarse como un SQL=/<>? En SQL,foo = NULLyfoo <> NULLsiempre devolverá falso, porque NULL es 'incomparable': solo funcionarán los operadores especialesfoo IS NULLyfoo IS NOT NULL. El comportamiento debe ser similar en PoSH, donde su-not (foo -eq "bar")filtro devolvería todo lo que(foo -eq "bar")devolvió$false, lofoo -eq $nullque haría. En cambio, ¿qué talif (!foo -or foo -ne "bar")(SQL equivalentefoo IS NULL OR foo <> 'bar')?Respuestas:
La diferencia clave entre los dos es que el primer comando no implica una comparación directa de valores para obtener todos los resultados, y el segundo comando sí. El primer comando incluye resultados NULL y el segundo no (como MDMarra ya descubrió). Ambos comandos comienzan con este cmdlet:
Cuando revise lo siguiente, recuerde que los resultados de este cmdlet incluyen a todos los usuarios de AD, independientemente de cualquier otra cosa en el
-filterparámetro posterior.Ahora analicemos las dos partes que son diferentes. El primero:
...medio
-eqoperador pueda compararla con" auto ". Los valores NULL se eliminan de esto comparación ya que no puede comparar un valor NULL con un valor de cadena.-eqEl parámetro de filtro me da TODO lo que NO es el resultado de(description -eq "auto"), que incluirá NULL, porque el cmdlet originalget-aduser, incluye a todos los usuarios de AD. No tenía que comparar nada con el-notoperador con nada más . Simplemente te dio todo además de cuáles fueron los resultados del(description -eq "auto")filtro.En su ejemplo, suponga que tiene 1 usuario de AD que tiene una descripción igual a "auto", unos pocos cientos con algo diferente a "auto" y unos pocos cientos con descripciones NULL. Recorriendo la lógica del comando hará:
Como no tenía que comparar nada con el
-notoperador, el resultado incluyó a los usuarios de descripción NULL que se capturaron en elget-adusercmdlet original .El segundo comando:
...medio
-neoperador pueda compararla con" auto ". Valores NULL se eliminan de esta comparación ya que no puede comparar un valor NULL con un valor de cadena.En su ejemplo nuevamente, suponga que tiene 1 usuario de AD que tiene una descripción igual a "auto", unos pocos cientos con algo diferente a "auto" y unos pocos cientos con descripciones NULL. Recorriendo la lógica del comando hará:
De cualquier manera, la diferencia entre los dos comandos es definitivamente no intuitiva.
Usando este comando, deberías poder atrapar los NULL con un "-y" allí también así:
No estoy 100% en la sintaxis ya que no puedo probarlo en este momento, y probablemente también haya una mejor manera de hacerlo. Cuando todo está descompuesto, es bastante anti-climático y me costó mucho explicarlo, pero me he encontrado con cosas raras como esta antes de usar los diversos operadores y muchas pruebas y errores, ya que nunca puedo recordar todas las advertencias. que van junto con el uso de cada uno.
Referencia: http://technet.microsoft.com/en-us/library/hh847732.aspx :
fuente
Agregando a esta vieja pregunta como surge cuando busca:
El uso de -Filter con coincidencia negativa, como -ne o -notlike, excluye los resultados con valores nulos vacíos. Para que se incluyan, también debe hacer coincidir explícitamente el uso de -notlike '*' como -eq '' y -eq $ NULL no son filtros válidos. Tenga en cuenta que esta es una peculiaridad con -Filter, utilizando un -LdapFilter directo que hace coincidir los valores vacíos negativos.
Aquí hay un ejemplo de filtro y LdapFilter de coincidencia múltiple con negativo:
fuente