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

时间:2019-08-20 14:01:41

标签: powershell powershell-5.0

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

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

“专有名称”的示例如下:

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值。我找不到正确的语法来相应地更新查询。任何帮助将不胜感激。

以下是版本信息: enter image description here

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

1 个答案:

答案 0 :(得分:3)

现在您已将事情弄清楚了,我认为这可以满足您的要求。 [咧嘴]

它做什么...

  • 创建两个要使用的用户对象
    当您准备使用数据集时,请将其删除。 [咧嘴]
  • 通过用户列表进行迭代
  • 拆分DistinguishedName以获取OU
  • $OuList变量设置为一个数组,即使只有一个OU
  • 使用预期的最大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