在Get-ADComputer中修改distinguishedName的输出

时间:2013-11-13 09:23:39

标签: powershell

我的PowerShell知识非常基础。无论如何,我正在尝试制作一个脚本,用于转换Get-ADComputer中distinguishedName的输出。

我正常情况下使用Get-ADComputer查询服务器的结果,distinguishedName看起来像这取决于OU的结构:

CN=<servername>,OU=Others,OU=Servers,OU=0180,DC=win,DC=dom,DC=<something>,DC=com

我想要做的是将输出转换为两列并重新组织信息。到目前为止,我已经得到了两个列的部分,如下所示。

  

名称ParentContainer
  ------- ---------------
  server1 OU =其他,OU =服务器,OU = 0180,DC = win,DC = dom,DC =,DC = com
  server2 OU = DRA8,OU =服务器,OU =管理员,DC = win,DC = dom,DC =,DC = com
  server3 OU =其他,OU =服务器,OU = 0180,DC = win,DC = dom,DC =,DC = com
  server4 OU =其他,OU =服务器,OU = 0180,DC = win,DC = dom,DC =,DC = com
  server5 OU =服务器,OU = 4611,DC = win,DC = dom,DC =,DC = com

脚本如下所示:

$list = Get-Content "C:\temp\testservers.txt"
foreach ($servers in $list)
{
Get-ADcomputer "$servers" -Properties distinguishedName,cn | 
select name, @{n='ParentContainer';e={$_.distinguishedname -replace '^.+?,(CN|OU.+)','$1'}}
}

现在到了棘手的部分。在“ParentContainer”列中,我希望删除所有“DC =”值,然后切换OU,而不是上面的内容,它应该如下所示。

  

名称ParentContainer
  ------- ---------------
  server1 OU = 0180,OU = Servers,OU = Others
  server2 OU = Admins,OU = Servers,OU = DRA8
  server3 OU = 0180,OU =服务器,OU =其他
  server4 OU = 0180,OU =服务器,OU =其他
  server5 OU = 4611,OU =服务器

这样做的原因是,更容易看到OU结构以及服务器放置在CSV文件中的OU。

是否有可能在深水中做或者我出去?

此致 Torbjorn Persson

3 个答案:

答案 0 :(得分:4)

试一试。拆分DN,第一个元素为您提供服务器名称。然后使用范围运算符从上到下获取所有其他元素,这些元素不以'dc ='开头,然后加入然后返回。:

Get-ADComputer -Filter * | ForEach-Object{

    $dn = $_.DistinguishedName.Split(',')

    New-Object PSObject -Property @{
        Name = $dn[0] -replace '^cn='
        ParentContainer = $dn[$dn.length..1] -notlike 'dc=*' -join ','
    }

}

顺便说一下,您可能想要检查CanonicalName属性。它可以以类似的方式为您提供您所需的输出,而无需操纵DN。

答案 1 :(得分:0)

您可以编写内联代码,但为了简化操作,请导入我编写的Format-OU函数,然后将您选择的代码行调整为:

select name, @{n='ParentContainer';e={Format-OU -OUString $_.distinguishedname}}

Format-OU功能:

Function Format-OU()
{
    param
    (
        [String]$OUString
    )
    $OUString = $OUString.Substring(0,$OUString.IndexOf("DC")-1)
    $OUArray = $OUString.Split(",")
    $Result = ""
    $Count = 1
    $OUArray | % {IF ($Count -eq 1) {$Result = $Result.Insert(0,"$_")} ELSE {$Result = $Result.Insert(0,"$_,")};$Count++}
    Return $Result
}

答案 2 :(得分:0)

这是另一种可能性:

Get-ADComputer -Filter * | ForEach-Object{  
  $split = ($dn -split 'CN=|,DC=.+').split(',',2) 
  New-Object PSObject -property @{
   Name=$split[1];ParentContainer=$split[2]}
}