Lógica compleja de objeto dónde de Powershell

CorePress2024-01-16  11

Tengo problemas para encontrar una manera de hacer una lógica compleja usando el objeto donde en PowerShell

Tengo el siguiente código, pero separar y de ors no funciona según lo previsto.

Get-ADComputer -Filter * | Where-Object {($_.Enabled) -and
                                    (($_.DistinguishedName -Contains "world") -or
                                        ($_.DistinguishedName -Contains "foo")) -and
                                        (($_.SID -Contains "bar") -or
                                        ($_.SID-Contains "something else"))}

Si hago esto en C# obtengo resultados, pero en PowerShell no.

¿Alguna idea sobre cómo solucionar este problema?

AIT

1

¿Qué sucede si agrega una prueba a la vez? ¿En qué momento la prueba no da los resultados esperados?

- Lee_Dailey

19/03/2021 a las 15:51

¿Por qué el SID contendría cadenas?

- Mathias R. Jessen

19/03/2021 a las 15:55

2

Además, el operador -contains es un operador de colección, no un operador de cadena. probablemente debas usar -match o -like con comodines.

- Lee_Dailey

19/03/2021 a las 15:55



------------------------------------

Así es como realizaría su consulta utilizando el módulo AD PS:

Get-ADComputer -LDAPFilter "(!userAccountControl:1.2.840.113556.1.4.803:=2)"|where-object{
    $_.DistinguishedName -match 'World|Foo' -and $_.SID -match 'bar|something else'
}
-LDAPFilter "(!userAccountControl:1.2.840.113556.1.4.803:=2)" = Objeto de computadora habilitado -match permite el uso de expresiones regulares, puedes usar la canalización como OR.

-contains es el operador que usaría para buscar un elemento en una matriz. Ejemplo:

PS /> @(
'apple'
'banana'
'pineapple'
) -contains 'apple'

True

Además, como Dave Wyatt señaló en una bonita publicación en powershell.org hace un tiempo, es posible que quieras evitar el objeto donde siempre que sea posible, ya que es la forma más lenta de filtrar colecciones. Sus únicas ventajas son el bajo consumo de memoria y la transmisión por secuencias. A continuación se muestran algunos ejemplos de código más rápido y eficiente:

#Example 1:
$computers=Get-ADComputer -LDAPFilter "(!userAccountControl:1.2.840.113556.1.4.803:=2)"
$collection=[system.collections.generic.list[Microsoft.ActiveDirectory.Management.ADComputer]]::new()

foreach($computer in $computers)
{
    if($computer.DistinguishedName -match 'World|Foo' -and $computer.SID -match 'bar|something else')
    {
        $collection.add($computer)
    }
}

#Example 2:
filter myFilter{
    if($_.DistinguishedName -match 'World|Foo' -and $_.SID -match 'bar|something else')
    {
        $_
    }
}

$computers=Get-ADComputer -LDAPFilter "(!userAccountControl:1.2.840.113556.1.4.803:=2)"|myFilter

#Example 3
$computers=(Get-ADComputer -LDAPFilter "(!userAccountControl:1.2.840.113556.1.4.803:=2)").where({
    $_.DistinguishedName -match 'World|Foo' -and $_.SID -match 'bar|something else'  
})

Hay mucha información sobrelas diferentes formas de filtrar Colecciones en PowerShell y sus pros y contras en Google.

1

Gracias, este es exactamente el intercambio de conocimientos que necesitaba. Agradezco los aportes de todos y perdón por mi falta de conocimiento.

- juan

19/03/2021 a las 16:39



------------------------------------

Esta no es una respuesta, así que avíseme cuando la haya leído para que puedaeliminarlo.

Este es su código con sangría más informativa, sin los paréntesis adicionales innecesarios y con espacios alrededor de los operadores.

Get-ADComputer -Filter * |
    Where-Object {
        $_.Enabled -and
        ($_.DistinguishedName -Contains "world" -or
            $_.DistinguishedName -Contains "foo") -and
        ($_.SID -Contains "bar" -or
            $_.SID -Contains "something else")
        }

tenga en cuenta que el operador -contains NO es para cadenas... es para pertenecer a una colección. si desea realizar pruebas con cadenas, utilice -match, o .Contains(), o -like con comodines.

6

2

"el operador -contiene NO es para cadenas" - suena como una respuesta Lee ;-)

- Mathías R. Jessen

19/03/2021 a las 16:00

@MathiasR.Jessen - ok... eliminaré esa parte de la respuesta. ¡gracias por los comentarios! [sonrisa]

- Lee_Dailey

19/03/2021 a las 16:31

1

¿Por qué no simplemente eliminar el descargo de responsabilidad? ¿Por qué odias tanto responder preguntas? :)

- Mathias R. Jessen

19/03/2021 a las 16:32

@MathiasR.Jessen: muchas veces la respuesta me parece más un comentario. Parece que tengo algunos problemas para decidir de qué lado de la línea debe estar este.

- Lee_Dailey

19/03/2021 a las 16:35

Leer, muchas gracias.

- juan

19/03/2021 a las 16:37

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare