Powershell agindo de forma diferente para valores versus matrizes?

Powershell agindo de forma diferente para valores versus matrizes?

Estou tentando obter algumas informações do Active Directory usando o Powershell, mas recebo um comportamento estranho. Aqui está meu roteiro:

$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?!

O primeiro imprime o que espero, uma tabela de propriedades; o último acaba imprimindo "0 1" repetidamente, embora eu não saiba por quê. Por que o caso único funcionaria, mas não o array?

Responder1

O que você deseja fazer é consultar o Catálogo Global, pois deseja pesquisar em toda a floresta. Existem algumas abordagens, mas a mais simples é alterar sua raiz de pesquisa para GC. por exemplo

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

Alternativamente, você pode consultar a floresta e, em seguida, solicitar uma lista de Catálogos Globais e usar um deles como entrada de diretório inicial, mas esta é uma alteração bastante simples que fará o que você deseja, desde que os campos que você está pesquisando estejam no GC. A parte de pesquisa não deve ser um problema no seu caso, pois você está pesquisando por nome de usuário, que é global por padrão, mas você não obterá o campo Departamento de volta do resultado da pesquisa porque Departamento não é global por padrão. Para obtê-lo, você precisará usar o Nome Distinto do resultado da pesquisa para fazer uma pesquisa subsequente do AD no domínio dos usuários para o objeto de usuário do AD completo e, em seguida, retirar o Departamento dele. Você poderia alterar seu esquema para que o Departamento fosse global, mas isso seria um pouco radical na IMO.

Você pode encontrar a lista abrangente dosatributos globais padrão aqui.

Responder2

Talvez seja necessário especificar um loop foreach como foreach ($user in $toFind) { get-aduser $user }

O que acontece se você simplesmente digitar $toFind no prompt? Presumo que listaria os dois nomes, um por linha, como deveria.

Tentei executar esse mesmo código no meu AD e obtive os seguintes resultados: 0 1

Nome Valor ---- ----- nome {Sahnti L. Aphil} adspath {LDAP://CN=Sahnti L. Aphil,OU=Usuários,OU=Jackson,DC=empresa,DC=local} 0 1 nome Caminho de anúncio {Hamong Justice} {LDAP://CN=Hamong Justice,OU=Usuários,OU=Jackson,DC=empresa,DC=local}

Responder3

Apenas uma observação: eu recomendo fortemente dar uma olhada no pacote de cmdlets do Quest AD (http://www.quest.com/powershell/activeroles-server.aspx) para todas as coisas do PowerShell relacionadas ao AD. Isso preenche uma lacuna, pois o suporte AD integrado no PowerShell é muito ruim. Isso economizará muito tempo de desenvolvimento.

Responder4

Para sua informação, o motivo pelo qual você obtém a saída de 0 e 1 é porque a chamada para $objSearcher.PropertiesToLoad.Add() retorna o índice da propriedade que foi adicionada (0 para a primeira propriedade, 1 para a segunda). Isso acontecerá uma vez para cada usuário no seu script. Você pode suprimir o valor de retorno canalizando-o para Out-Null.

informação relacionada