我在使用脚本列出 CSV 文件中每个用户所属的用户和组时遇到问题。我尝试了多种导出这些对象的方法,但不知道如何删除输出中的 @{} 标记。
我的输出是:
@{Name=简·多伊}
@{Group=区域 OU 管理员}
这是我的代码:
$OUPath = “OU=Computers, OU=HQ,OU=USA,DC=STACKOVERFLOW,DC=COM”
$users = (get-aduser -Filter * -SearchBase $OUpath | select SamAccountName)
ForEach ($User in $Users)
{ $Username = Get-ADUser $($user.SamAccountName) -Properties MemberOf
$Groups = ForEach ($Group in ($Username.MemberOf))
{ (Get-ADGroup $Group).Name
}
$Groups = $Groups | Sort
ForEach ($Group in $Groups)
{ New-Object PSObject -Property @{
Name = $Username.Name
Group = $Group
} | Select name,group | Add-Content C:\Temp\test.csv
}
}
我在这里做错了什么?
最佳答案
您正在将对象写入 TXT 文件。在以这种方式编写输出之前,您必须先格式化输出,但是有一种更好的方法可以完成您想要做的事情(看起来):
ForEach ($User in $Users) {
$Username = Get-ADUser $($user.SamAccountName) -Properties MemberOf
$Groups = ForEach ($Group in ($Username.MemberOf)) {
(Get-ADGroup $Group).Name
}
if ($null -eq $Groups) {
continue;
}
$Groups | Sort | Select-Object @{ "Name" = "Group"; "Expression" = { $_ } }, @{ "Name" = "Name"; "Expression" = { $Username.Name } } | Export-Csv "D:\temp\$($Username.Name).csv" -Encoding utf8
}
请注意,此脚本将为每个用户输出 1 个 CSV 文件,但您可以轻松聚合结果并将其通过管道传输到单个 Export-Csv
!
编辑
根据要求,这是将所有信息聚合到单个 CSV 文件中的变体。这与您最初的实现略有不同。这是我能想到的最好的方法:
$users = Get-ADUser -LDAPFilter "(sAMAccountName=vi*)" -Properties @("MemberOf");
$result = New-Object "Collections.Generic.List[Object]";
foreach ($user in $users) {
if ($null -eq $user.MemberOf) { continue; }
$memberOf = $user.MemberOf | Get-ADGroup | Select-Object -ExpandProperty Name;
$memberOf | ForEach-Object { $result.Add((New-Object PSObject -Property @{
Name = $user.Name
Group = $_
}))};
}
$result | Sort-Object Name | Export-Csv D:\temp\output.csv -Encoding utf8;
关于powershell - 如何从对象输出中删除@{}标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71742446/