我正在显示组中的所有用户:
Import-Module ActiveDirectory
$Groups = Get-ADGroup -Filter {name -like "UC_*"} | Select -ExpandProperty Name # UC_* is my group
foreach ($Group in $Groups){
Write-Output "Group"
Write-Output "-----"
$Group
Write-Output ""
Get-ADGroupMember -Identity $Group | select -Property Name, samaccountname
Write-Output ""
}
我想将其输出到CSV但是当我这样做时,看起来每一行都被循环中的下一行覆盖,因此CSV中没有数据。这不能正常工作:
# Get users in a group or groups
Import-Module ActiveDirectory
Function Get-Users {
$Groups = Get-ADGroup -Filter {name -like "UC_*"} | Select -ExpandProperty Name # UC_* is my group
foreach ($Group in $Groups){
Write-Output "Group"
Write-Output "-----"
$Group
Write-Output ""
Get-ADGroupMember -Identity $Group | select -Property Name, samaccountname
Write-Output ""
}
}
Get-Users | export-csv "c:\temp\myfile.csv"
如何正确地将所有内容输出到CSV?
答案 0 :(得分:3)
您的功能输出为Write-output
,$Group
,以及Get-ADGroupMember
返回的对象。这个不同对象的集合使它无法由Export-CSV
导出,但是可以通过Out-File
导出文本文档。
如果要导出到csv,则需要使用要导出的属性创建一致对象的集合:
因此,我们会使用ForEach-Object
循环遍历每个群组,并将群组成员资格存储在$members
中。然后可以使用foreach
循环遍历,这意味着我们仍然可以使用ForEach-Object
中$_
循环中的信息来获取组的名称,以及$member
中的用户信息{1}}并为每个用户创建一个对象,其中只包含[pscustomobject]
Get-ADGroup -Filter "name -like 'UC_*'" |
ForEach-Object {
$members = Get-ADGroupMember $_
foreach ($member in $members) {
[pscustomobject]@{
"Group Name" = $_.Name
"SamAccountName" = $member.SamAccountName
"User Name" = $member.name
}
}
} |
Export-Csv "c:\temp\myfile.csv"
同样如@ mklement0所述,最佳做法是不将scriptblock与AD cmdlet上的过滤器一起使用。 His excellent answer这里详细说明原因。
答案 1 :(得分:0)
这个怎么样:
$Groups = Get-ADGroup -Filter {name -like "UC_*"} | Select -ExpandProperty Name # UC_* is my group
$Groups | Export-Csv "c:\temp\myfile.csv" -NoTypeInformation
答案 2 :(得分:0)
输出CSV有两种选择。使用Export-CSV
将覆盖已存在的文件。因此,您可以将所有内容放入变量并将其输出到CSV,也可以将-Append
添加到Export-CSV
cmdlet调用中。这将附加数据而不是覆盖它。
答案 3 :(得分:0)
将您在函数中解析的数据存储在对象中。
例如,改变这个......
$Groups = Get-ADGroup -Filter {name -like "UC_*"} | Select -ExpandProperty Name # UC_* is my group
foreach ($Group in $Groups){
Write-Output "Group"
Write-Output "-----"
$Group
Write-Output ""
Get-ADGroupMember -Identity $Group | select -Property Name, samaccountname
Write-Output ""
......这样的事情......
$users = @()
$groups = Get-ADGroup -Filter {name -like "UC_*"} | Select -ExpandProperty Name
$groups | % {
$group | New-Object System.Object
$group | Add-Member -MemberType NoteProperty -Name GroupName -Value $_
Get-ADGroupMember -Identity $_ | Select -Property Name, samaccountname | % {
$group | Add-Member -MemberType NoteProperty -Name MemberName -Value $_.Name
$group | Add-Member -MemberType NoteProperty -Name samaccountname -Value $_.samaccountname
}
$users += $group
}
我还没有测试过上面的代码,但希望它有所帮助。