我的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
答案 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]}
}