0

我的powershell知识非常基础。无论如何,我正在尝试制作一个脚本,该脚本将在 Get-ADComputer 中转换来自 distinctName 的输出。

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

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

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

Name ParentContainer
------- ---------------
server1 OU=Others,OU=Servers,OU=0180,DC=win,DC=dom,DC=,DC= com
server2 OU=DRA8,OU=Servers,OU=Admins,DC=win,DC=dom,DC=,DC=com
server3 OU=Others,OU=Servers,OU=0180,DC=win,DC=dom,DC =,DC=com
server4 OU=Others,OU=Servers,OU=0180,DC=win,DC=dom,DC=,DC=com
server5 OU=Servers,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,而不是上面的,它应该如下所示。

Name ParentContainer
------- ---------------
server1 OU=0180,OU=Servers,OU=Others
server2 OU=Admins,OU=Servers,OU=DRA8
server3 OU =0180,OU=服务器,OU=其他
服务器4 OU=0180,OU=服务器,OU=其他
服务器5 OU=4611,OU=服务器

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

有可能做还是我在深水中?

问候托比约恩·佩尔松

4

3 回答 3

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。

于 2013-11-13T11:48:38.900 回答
0

这是另一种可能性:

Get-ADComputer -Filter * | ForEach-Object{  
  $split = ($dn -split 'CN=|,DC=.+').split(',',2) 
  New-Object PSObject -property @{
   Name=$split[1];ParentContainer=$split[2]}
}  
于 2013-11-13T13:10:02.997 回答
0

您可以编写内联代码,但为了使事情更容易,请导入我编写的 Format-OU 函数,然后将您选择的代码行调整为:

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

格式-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
}
于 2013-11-13T11:36:21.510 回答