¿Powershell actúa de manera diferente para valores y matrices?

¿Powershell actúa de manera diferente para valores y matrices?

Estoy intentando obtener información de Active Directory usando Powershell, pero obtengo un comportamiento extraño. Aquí está mi guión:

$toFind = ( 'bobjones', 'samsmith' )

filter Get-AdUser {
    $strFilter = "(&(objectCategory=User)(sAMAccountName=$_))"

    $objDomain = New-Object System.DirectoryServices.DirectoryEntry
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.PageSize = 1000
    $objSearcher.Filter = $strFilter

    $colProplist = ("name", "department")
    foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}

    ($objSearcher.FindAll() | %{$_.Properties})
}

"paul" | get-aduser # Works
$toFind | get-aduser # Doesn't work?!

El primero imprime lo que espero, una tabla de propiedades; este último termina imprimiendo "0 1" repetidamente, aunque no estoy seguro de por qué. ¿Por qué funcionaría el caso único pero no la matriz?

Respuesta1

Lo que desea hacer es consultar el Catálogo global ya que desea buscar en todo el bosque. Hay un par de enfoques, pero el más simple es cambiar la raíz de búsqueda al GC. p.ej

$objSearcher.SearchRoot = [ADSI]"GC://$($objDomain.Name)" 

Alternativamente, puede consultar el bosque y luego solicitarle una lista de catálogos globales y usar uno de ellos como entrada de directorio inicial, pero este es un cambio bastante simple que hará lo que desea, siempre que los campos que está buscando estén en el GC. La parte de búsqueda no debería ser un problema en su caso, ya que está buscando por nombre de usuario, que es global de forma predeterminada, pero no recuperará el campo Departamento del resultado de la búsqueda porque el Departamento no es global de forma predeterminada. Para obtenerlo, deberá utilizar el nombre distinguido del resultado de la búsqueda para realizar una búsqueda de AD posterior en el dominio de los usuarios para obtener el objeto de usuario de AD completo y luego sacar el Departamento de allí. Podría cambiar su esquema para que el Departamento sea global, pero en mi opinión, eso sería un poco radical.

Puede encontrar la lista completa deatributos globales predeterminados aquí.

Respuesta2

Es posible que tengas que especificar un bucle foreach como foreach ($user in $toFind) { get-aduser $user }

¿Qué sucede si simplemente escribe $toFind cuando se le solicite? Supongo que incluiría ambos nombres, uno por línea, como debería.

Intenté ejecutar este mismo código en mi AD y obtuve los siguientes resultados: 0 1

Nombre Valor ---- ----- nombre {Sahnt L. Aphil} adspath {LDAP://CN=Sahnt L. Aphil,OU=Users,OU=Jackson,DC=company,DC=local} 0 1 nombre {Hamong Justice} ruta de anuncios {LDAP://CN=Hamong Justice,OU=Users,OU=Jackson,DC=company,DC=local}

Respuesta3

Solo una nota al margen: recomiendo encarecidamente buscar en el paquete de cmdlets de Quest AD (http://www.quest.com/powershell/activeroles-server.aspx) para todas las cosas de PowerShell relacionadas con AD. Llena un vacío ya que el soporte AD incorporado en PowerShell es bastante malo. Le ahorrará mucho tiempo de desarrollo.

Respuesta4

Para su información, la razón por la que obtiene el resultado 0 y 1 es porque la llamada a $objSearcher.PropertiesToLoad.Add() devuelve el índice de la propiedad que se agregó (0 para la primera propiedad, 1 para la segunda). Esto sucederá una vez para cada usuario en su secuencia de comandos. Puede suprimir el valor de retorno canalizándolo a Out-Null.

información relacionada