Filtragem Powershell ou seleção de determinados objetos

Filtragem Powershell ou seleção de determinados objetos

Então, quando executo este comando:

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

Eu obtenho os seguintes resultados:

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

Gostaria de filtrar o DistinguishedName para fornecer apenas a primeira UO. Devo acrescentar que não esperaria que "Contas de serviço" fosse o único item no campo UO. Eu gostaria que os resultados fossem:

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

Tenho tentado fazer disso um oneliner usando Filter, mas sem sorte. Talvez eu tenha que dividir o comando e transformá-lo em mais código para dividir o DistinguishedName. Sinto que existe uma solução simples para isso e estou tornando tudo mais complicado. Algum pensamento ou ideia?

Responder1

Encontrei uma boa respostaaqui. Vá Get-ADUserpara esta Select-Objectdeclaração:

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

A saída é:

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

Responder2

O filtro não analisa strings, apenas retorna os dados que você solicitou. Se você estiver extraindo DN, ou strings de grupo, ou arrays, qualquer coisa que não seja uma string única, então você mesmo precisa analisá-lo, usando substring ou regex

Aqui está uma opção usando regex e split

# 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 a abordagem acima com uma propriedade calculada

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

Ou esta como a propriedade calculada ...

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

... usando um ou (o cano entre as duas picadas derramadas) na divisão. Também é uma coisa de regex que funciona com .split

informação relacionada