首页 > 解决方案 > 从 CSV 文件中过滤启用的 AD 用户

问题描述

我有一个脚本来导入用户列表,并想检查这些用户是否被禁用。我确实尝试运行下面的脚本,但它不会过滤 CSV 文件中的用户,它会过滤整个组织中的每个人。任何建议,将不胜感激。如果需要使用标头,则在 CSV 文件中的标头之一中显示名称和 SIP 地址。

Import-CSV -Path .\Piscataway-+1732.csv  | ForEach-Object {
  Get-ADUser -Filter "Enabled -eq '$true'"  | select Enabled,EmailAddress,SamAccountName
} | Export-CSV .\results77.csv -NoTypeInformation

标签: powershellactive-directoryexport-to-csv

解决方案


你有几个问题:

  1. 您正在管道从Import-CsvForEach-Object。所以Get-ADUser并不真正知道您正在管道输入对象。
  2. Get-ADUser-Identity参数是按值,而不是按属性名称。因此,您需要回显相应的列以将其发送到管道中。
  3. 如果您使用管道并使用该-Filter参数,则过滤器将应用于整个域。它不会将过滤器限制为您输入的内容。
  4. 如果您想输出电子邮件地址,您必须告诉Get-ADUser检索它。

尝试这样的事情:

Import-CSV -Path .\Piscataway-+1732.csv  | 
ForEach-Object{ $_.samAccountName }
Get-ADUser -Properties mail | 
Where-Object{ $_.Enabled }
Select-Object Enabled,mail,SamAccountName  | 
Export-CSV .\results77.csv -NoTypeInformation

注意:电子邮件地址的属性是“mail”。

注意:因为我们没有 CSV 文件的样本,所以上面的例子假设有一个列名为 samAccountName。

现在,如果您希望输出来自 CSV 文件,但要根据 AD 中的用户状态对其进行验证,我们必须更改方法。与往常一样,有几种方法可以做到这一点。

示例 1:

Import-CSV -Path "c:\temp\test.csv"  | 
Select-Object @{Label = 'Enabled'; Expression = { ( Get-ADUser $_.samAccountName ).Enabled } },EmailAddress,samAccountName |
Export-CSV -Path "c:\temp\Output.csv" -NoTypeInformation

这再次假定列名 (samAccountName)。它还假设还没有“启用”列。因此,我们添加了一个通过 Get-ADUser 获得的名为 enabled 的属性。然后最后重新导出为 Csv。

示例 2:

$CsvData = Import-CSV -Path "c:\temp\test.csv"

$EnabledUsers = 
( 
    $CsvData | 
    ForEach-Object{ $_.samAccountName } |
    Get-ADUser |
    Where-Object{ $_.Enabled }
).samAccountName

$CsvData | 
Where-Object{ $EnabledUsers -contains $_.samAccountName } |
Select-Object @{Label = 'Enabled'; Expression = { $true } },EmailAddress,samAccountName |
Export-Csv -Path "c:\temp\Output.csv" -NoTypeInformation

示例 1 非常适合小型作业,但对于大型运行来说,太多的单独调用Get-ADUser可能会很慢。在此示例中,导入 CSV 数据一次。然后使用它来获取在 AD 中启用的那些条目的平面列表。完成后,您可以使用-contains操作员检查帐户是否已启用。再次添加“启用”属性需要做一些额外的工作。

这应该给你一个大致的想法。可能还有十几种方法可以做到这一点,但希望这能让您对必须发生的事情有一个很好的了解。让我知道这是否有帮助。


推荐阅读