如何通过 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
我用来获取在 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 也将
- 使用预期的最大 OU 数量构建自定义对象
您需要提前确定。 - 将该对象发送到
$Results
集合 - 显示该集合
$OuList
变量变成一个数组
到那时,您就有了一个可以优雅地导出到 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