我的powershell知识非常基础。无论如何,我正在尝试创建一个脚本,它将在Get中转换来自distinguishedName的输出。
通常情况下,使用Get-ADComputer查询服务器的结果-- distinguishedName看起来是这样的--这取决于OU的结构:
CN=<servername>,OU=Others,OU=Servers,OU=0180,DC=win,DC=dom,DC=<something>,DC=com我想要做的是将输出转换成两列并重新组织信息。到目前为止,我已经得到了两个列排序的部分,如下所示。
名称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,因此与上面不同,它应该如下所示。
名称ParentContainer - server1 OU=0180,OU=Servers,OU=Others server2 OU=Admins,OU=Servers,OU=DRA8 server3 OU=0180,OU=Servers,OU=Others server4 OU=0180,OU=Servers,OU=Others server5 OU=4611,OU=Servers
这样做的原因是,可以更容易地看到OU结构,以及服务器放置在CSV文件中的OU。
我能在深水里做吗?或者我在深水里?
向Torbjorn Persson问好
发布于 2013-11-13 11:48:38
试试看。拆分DN后,第一个元素将给出服务器名称。然后使用range运算符获取所有其他元素,这些元素自上而下,不以“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-13 11:36:21
您可以编写内联代码,但为了简化操作,请导入我编写的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-13 13:10:02
这里还有另一种可能性:
Get-ADComputer -Filter * | ForEach-Object{
$split = ($dn -split 'CN=|,DC=.+').split(',',2)
New-Object PSObject -property @{
Name=$split[1];ParentContainer=$split[2]}
} https://stackoverflow.com/questions/19949933
复制相似问题