Powershell 在Get ADComputer中修改DifferentizedName的输出

Powershell 在Get ADComputer中修改DifferentizedName的输出,powershell,Powershell,我的powershell知识相当基础。无论如何,我正在尝试制作一个脚本,它将在一台Get-ADComputer中转换DiscrimitedName的输出 在正常情况下,使用Get-ADComputer查询服务器的结果DifferentizedName如下所示,具体取决于OU的结构: CN=<servername>,OU=Others,OU=Servers,OU=0180,DC=win,DC=dom,DC=<something>,DC=com 现在进入棘手的部分。在“Pa

我的powershell知识相当基础。无论如何,我正在尝试制作一个脚本,它将在一台Get-ADComputer中转换DiscrimitedName的输出

在正常情况下,使用Get-ADComputer查询服务器的结果DifferentizedName如下所示,具体取决于OU的结构:

CN=<servername>,OU=Others,OU=Servers,OU=0180,DC=win,DC=dom,DC=<something>,DC=com
现在进入棘手的部分。在“ParentContainer I want to have all”DC=“values”列中,删除所有值,然后切换OU,使其看起来与下面的类似,而不是上面的

名字  父容器
-------  ---------------
服务器1  OU=0180,OU=服务器,OU=其他
服务器2  OU=管理员,OU=服务器,OU=DRA8
服务器3  OU=0180,OU=服务器,OU=其他
服务器4  OU=0180,OU=服务器,OU=其他
服务器5  OU=4611,OU=服务器

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

有可能吗?还是我在深水区

问候
Torbjorn Persson

您可以编写内联代码,但为了简化操作,请导入我编写的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
}

您可以编写内联代码,但为了简化操作,请导入我编写的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
}

尝试一下。拆分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。

尝试一下。拆分DN时,第一个元素将为您提供服务器名称。然后使用range操作符从上到下获取所有其他不以“d”开头的元素c='并连接,然后返回:

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。

还有一种可能性:

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

还有一种可能性:

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

没问题,如果它符合你的要求,就把它标记为答案。没问题,如果它符合你的要求,就把它标记为答案。