我有这个脚本,该脚本从文件中读取samaccountnames并输出带有其成员资格信息的用户名。但是,输出文件仅显示最后一条记录。看来我的代码正在覆盖以前的记录。我想念什么?非常感谢。
ForEach ($user in $(Get-Content -Path C:\MyScripts\UsersInput.csv))
{
$username = Get-ADUser –Identity $user -Properties *
Get-ADPrincipalGroupMembership $user | select $username.DisplayName, name |
export-csv "C:\MyScripts\UsersAndTheirADGroups.csv" -NoTypeInformation
}
答案 0 :(得分:1)
Export-Csv具有-append参数,因此您可以使用它。也就是说,它会在每次循环时附加到csv文件中。在开始循环之前,您需要确保文件不存在,否则每次运行代码时文件都会变得越来越大。
将项目添加到对象,然后在末尾导出的另一种方法。即$ username + = Get-ADUser ......
答案 1 :(得分:1)
您正在使用Get-Content
读取CSV文件。这让我认为该文件只是用户SamAccountNames的列表,每个列表都位于单独的一行中。没有标题。
也许是这样的:
jdoe
jsmith
如果是这种情况,请像这样读取输入文件:
$users = Get-Content -Path 'C:\MyScripts\UsersInput.csv'
获取用户SAMAccountnames的数组。
如果但是它是带有标题的正确CSV文件,则看起来像这样:
"SamAccountName","Email","More","Stuff"
"jdoe","john.doe@yourdomain.com","blah","blah"
"jsmith","jane.smith@yourdomain.com","blah","blah"
然后,您应该使用Import-Csv
cmdlet将条目作为对象获取,并从中获取SamAccountNames数组:
$users = Import-Csv -Path 'C:\MyScripts\UsersInput.csv' | Select-Object -ExpandProperty SamAccountName
一旦有了该数组,就循环遍历并获取每个用户的组成员身份信息
未经测试
$result = foreach ($accountName in $users) {
Get-ADUser –Identity $accountName -Properties DistinguishedName, DisplayName |
Select-Object @{Name = 'User'; Expression = {$_.DisplayName}},
@{Name = 'Groups'; Expression = { ( $_ | Get-ADPrincipalGroupMembership | Select-Object -ExpandProperty name) -join ', '}}
}
$result | Export-Csv "C:\MyScripts\UsersAndTheirADGroups.csv" -NoTypeInformation
答案 2 :(得分:0)
您确实覆盖了代码ForEach
用户。您在Export-Csv
中包括了ForEach
。而是导出ForEach
创建的整个数组:
ForEach ($user in $(Get-Content -Path C:\MyScripts\UsersInput.csv))
{
$username = Get-ADUser –Identity $user -Properties *
Get-ADPrincipalGroupMembership $user | select $username.DisplayName, name
} | export-csv "C:\MyScripts\UsersAndTheirADGroups.csv" -NoTypeInformation