如何通过 powershell 在不同的列中分别接收 OU 值?

How to receive OU values separately in different columns via powershell?

我用来获取在 AD 中注册的所有工作站列表的 powershell 查询如下:

Get-ADComputer -Filter {OperatingSystem -NotLike "*server*"} -Property * | Select-Object Name,SID,DistinguishedName,whenCreated,LastLogonDate | Export-CSV allworkstations2.csv -NoTypeInformation -Encoding UTF8

"DistinguishedName" 的示例如下:

CN=500-AV,OU=Workstations,OU=SecondOU,OU=ThirdOU,OU=FourthOU,DC=myDC1,DC=myDC2
CN=600-AV,OU=FirstOU,OU=SecondOU,OU=ThirdOU,OU=FourthOU,OU=FifthOU,DC=myDC1,DC=myDC2

请注意每个工作站的 OU 值的数量可能不同,不能说它总是 4。编辑: 一个工作站可以拥有的最大 OU 数量是 5 .

我需要单独的所有 OU 值,作为不同的列(OU1、OU2 等)。在 Excel 中,我使用下面的公式在单独的列中接收所有 OU 值:

=TRIM(MID(SUBSTITUTE(MID($B2,FIND(",OU=",$B2)+4,FIND(",DC=",$B2)-FIND(",OU=",$B2)-4),",OU=",REPT(" ",999)),(COLUMN(A:A)-1)*999+1,999))

我想要的是直接从powershell中获取不同列的OU值。我找不到正确的语法来相应地更新我的查询。任何帮助将不胜感激。

这是版本信息:

Edit2: 预期输出示例:

WorkstationName SID OU1          OU2      OU3     OU4      OU5 createdDate LastLogin
500-AV           X  Workstations SecondOU ThirdOU FourthOU null    1/1/2018   6/1/2018
600-AV           X  FirstOU      SecondOU ThirdOU FourthOU FifthOU 1/1/2018   6/1/2018

既然你稍微澄清了一些事情,我想这就是你想要的。 [咧嘴一笑]

它的作用...

  • 创建两个要使用的用户对象
    当您准备好使用您的数据集时删除它。 [咧嘴一笑]
  • 遍历用户列表
  • 拆分 DistinguishedName 以获得 OU
  • 即使只有一个 OU
  • 也将 $OuList 变量变成一个数组
  • 使用预期的最大 OU 数量构建自定义对象
    您需要提前确定。
  • 将该对象发送到 $Results 集合
  • 显示该集合

到那时,您就有了一个可以优雅地导出到 CSV 文件的集合。 [咧嘴一笑]

这是代码...

$UserList = @(
    [PSCustomObject]@{
        ComputerName = '111-AV'
        SID = '1-22-333'
        DistinguishedName = 'CN=111-AV,OU=SolitaryOU,DC=myDC1,DC=myDC2'
        DateCreated = '2011-11-11'
        LastLogon = '2019-08-11'
        }
    [PSCustomObject]@{
        ComputerName = '500-AV'
        SID = '1234-5678-90'
        DistinguishedName = 'CN=500-AV,OU=Workstations,OU=SecondOU,OU=ThirdOU,OU=FourthOU,DC=myDC1,DC=myDC2'
        DateCreated = '2001-01-01'
        LastLogon = '2019-08-08'
        }
    [PSCustomObject]@{
        ComputerName = '666-AV'
        SID = '777-888-999'
        DistinguishedName = 'CN=666-AV,OU=Servers,OU=SrvOu2,OU=SrvOu3,OU=SrvOu4,OU=SrvOu5,DC=myDC1,DC=myDC2'
        DateCreated = '1999-12-31'
        LastLogon = '2019-08-20'
        }
    )

$Results = foreach ($UL_Item in $UserList)
    {
    [array]$OuList = @($UL_Item.DistinguishedName.Split(',')).
        Where({$_ -match 'OU='}).
        ForEach({$_.Split('=')[-1]}).
        Trim()

    [PSCustomObject]@{
        ComputerName = $UL_Item.ComputerName
        SID = $UL_Item.SID
        OU_1 = $OuList[0]
        OU_2 = $OuList[1]
        OU_3 = $OuList[2]
        OU_4 = $OuList[3]
        OU_5 = $OuList[4]
        DateCreated = $UL_Item.DateCreated
        LastLogon = $UL_Item.LastLogon
        }
    }

$Results

输出到屏幕...

ComputerName : 111-AV
SID          : 1-22-333
OU_1         : SolitaryOU
OU_2         : 
OU_3         : 
OU_4         : 
OU_5         : 
DateCreated  : 2011-11-11
LastLogon    : 2019-08-11

ComputerName : 500-AV
SID          : 1234-5678-90
OU_1         : Workstations
OU_2         : SecondOU
OU_3         : ThirdOU
OU_4         : FourthOU
OU_5         : 
DateCreated  : 2001-01-01
LastLogon    : 2019-08-08

ComputerName : 666-AV
SID          : 777-888-999
OU_1         : Servers
OU_2         : SrvOu2
OU_3         : SrvOu3
OU_4         : SrvOu4
OU_5         : SrvOu5
DateCreated  : 1999-12-31
LastLogon    : 2019-08-20