
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-ADUser
para esta Select-Object
declaraçã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