从输入文件中导出用户的成员资格组

时间:2019-01-11 02:49:34

标签: powershell

我有这个脚本,该脚本从文件中读取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  
}

3 个答案:

答案 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