Convierta ICollection en un psobject para pasar a ft o export-csv

Yo uso powershell para hacer algunas consultas ADSI/LDAP invocando DirectoryServices.DirectorySearcher ya que necesito proporcionar un conjunto alternativo de credenciales. Una vez que ejecuto un FindAll() método, obtengo un DirectoryServices.SearchResultCollection que implementa ICollection. A partir de ahí, si quiero canalizar esa salida a ft o export-csv, debo crear un nuevo psobject que copie los atributos que me interesan en un nuevo PSObject así:

$dEntry = New-Object DirectoryServices.DirectoryEntry("LDAP://acme.com/cn=sites,cn=configuration,dc=acme,dc=com","user","pass");
$searcher=New-Object DirectoryServices.DirectorySearcher($dEntry);
$searcher.Filter="(objectClass=siteLink)";
$searcher.PropertiesToLoad.Add("siteList");
$searcher.PropertiesToLoad.Add("cost");
$searcher.PropertiesToLoad.Add("replInterval");
$searcher.PropertiesToLoad.Add("cn");
$searcher.FindAll() |%{
$count=$_.Properties.sitelist.Count;
$p=@{"cn"=[string]$_.Properties.cn; "sites"=$count;
    "cost"=[string]$_.Properties.cost;
    "replInterval"=[string]$_.Properties.replInterval;
    };
    if ($count>=2) { 
        $p["mesh"]=$count;
    }else{
        $p["mesh"]=$count*$count;
    }
    New-Object psobject -Property $p
}

Esto parece bastante tedioso y, como probablemente sea una tarea tan común, seguramente debe haber una manera más fácil de hacerlo. Y sí, conozco las bibliotecas auxiliares de AD, pero no me ayudan, ya que necesito usar credenciales alternativas y la mayoría de ellas se rompen de esta manera.

preguntado el 04 de julio de 12 a las 09:07

Sugiero cambiar ($count>=2) a ($count -ge 2). -

1 Respuestas

Pruebe esto, copia cualquier propiedad encontrada en el objeto de búsqueda a un nuevo psotject:

$searcher.FindAll() | ForEach-Object {

    $pso = New-Object PSObject

    $_.PSBase.Properties.GetEnumerator() | Foreach-Object{
        Add-Member -InputObject $pso -MemberType NoteProperty -Name $_.Name -Value ($_.Value | foreach {$_})
    } 

    $pso
}

Respondido 04 Jul 12, 10:07

No breve, pero la mejor (y única) respuesta: Konrads

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.