Powershell filtrando ou selecionando certos objetos

0

Então, quando eu 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 OU apenas. Devo acrescentar que eu não esperaria que as "Contas de serviço" fossem o único item no campo da UO. Eu gostaria que os resultados fossem:

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

Eu tenho tentado fazer disso um oneliner usando o Filter, mas sem sorte. Talvez eu tenha que dividir o comando e dar mais código para quebrar o DistinguishedName. Eu sinto que há uma solução simples para isso e estou tornando isso mais complicado. Quaisquer pensamentos ou idéias?

    
por nizbit 21.08.2018 / 17:59

2 respostas

0

Encontrou uma boa resposta aqui . Pipe Get-ADUser para esta declaração Select-Object :

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

A saída é:

Name              DistinguishedName
----              -----------------
svc_myaccount     Service Accounts
    
por 21.08.2018 / 22:42
0

O filtro não analisa strings, apenas retorna os dados que você solicitou. Se você estiver obtendo DN, ou strings de grupo, ou arrays, qualquer coisa que não seja uma única string, você precisará analisá-la, 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 como a propriedade calculada ...

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

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

    
por 21.08.2018 / 21:37