Powershell filtrando o seleccionando ciertos objetos

Powershell filtrando o seleccionando ciertos objetos

Entonces, cuando ejecuto este comando:

Get-ADUser -Filter 'Name -like "*svc*"' | select Name, DistinguishedName

Obtengo los siguientes resultados:

SamAccountName       DistinguishedName
--------------       -----------------
svc_myaccount        CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com

Me gustaría filtrar el nombre distinguido para proporcionar únicamente la primera unidad organizativa. Debo agregar que no esperaría que "Cuentas de servicio" fuera el único elemento en el campo OU. Me gustaría que los resultados fueran:

SamAccountName       DistinguishedName
--------------       -----------------
svc_myaccount        OU=Service Accounts

He estado intentando hacer de esto una línea usando Filter pero no tuve suerte. Tal vez tenga que dividir el comando y desarrollarlo en más código para dividir el Nombre Distinguido. Siento que hay una solución simple para esto y lo estoy haciendo más complicado. ¿Alguna idea o pensamiento?

Respuesta1

encontré una buena respuestaaquí. Vaya Get-ADUsera esta Select-Objectdeclaración:

select Name,@{l='DistinguishedName';e={$_.DistinguishedName.split(',')[1].split('=')[1]}}

La salida es:

Name              DistinguishedName
----              -----------------
svc_myaccount     Service Accounts

Respuesta2

El filtro no analiza cadenas, solo devuelve los datos que solicitó. Si está extrayendo DN, cadenas de grupo o matrices, cualquier cosa que no sea una sola cadena, entonces debe analizarlo usted mismo, ya sea usando una subcadena o una expresión regular.

Aquí hay una opción usando expresiones regulares y división.

# Parse the DN for the OU array list
Remove the CN and split
('CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com' -replace 'CN=[^=]*,') -split(',')

# Results

OU=Service Accounts
OU=me3
OU=me2
DC=me
DC=com

#Get just the first element of the above array - arrays are zero based
(('CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com' -replace 'CN=[^=]*,') -split(','))[0]

#Results

OU=Service Accounts

Usando el enfoque anterior con una propiedad calculada

# Pulling live from ADDS
Get-ADUser -Filter 'Name -like "*svc*"' | 
Select-Object -Property Name, 
@{Name='DistinguishedName';Expression = { (($_.DistinguishedName -replace 'CN=[^=]*,') -split(','))[0]}}

O esto como la propiedad calculada...

 ('CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com').split(',|=')[3]

... usando un o (el tubo entre las dos picaduras derramadas) en la división. También es una expresión regular que funciona con .split.

información relacionada