【问题标题】:Modifying output for the distinguishedName in Get-ADComputer在 Get-ADComputer 中修改 distinctName 的输出
【发布时间】:2013-11-13 09:23:38
【问题描述】:

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

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

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

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

名称 父容器
-------  ---------------
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,而不是上面的,它应该如下所示。

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

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

有可能做还是我在深水?

问候 托比昂·佩尔松

【问题讨论】:

    标签: powershell


    【解决方案1】:

    试试这个。拆分 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。

    【讨论】:

    • 没问题,如果满足你的要求,考虑标记为答案。
    【解决方案2】:

    您可以编写内联代码,但为方便起见,请导入我编写的 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
    }
    

    【讨论】:

      【解决方案3】:

      这是另一种可能性:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 2018-07-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多