【问题标题】:Filter enabled AD users from CSV file从 CSV 文件中过滤启用的 AD 用户
【发布时间】:2020-10-09 03:07:05
【问题描述】:

我有一个脚本来导入用户列表,并想检查这些用户是否被禁用。我确实尝试运行下面的脚本,但它不会过滤 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

【问题讨论】:

  • 您没有使用从 CSV 文件中导入的数据。为此,您需要使用管道变量$_。另一种方法是使用Search-ADAccount –AccountDisabled –UsersOnly 查找所有禁用用户,并将此列表与Compare-Object 与您的CSV 文件中的数据进行比较。
  • 或许可以试试Get-ADUser -Filter "DisplayName -eq '$($_.DisplayName)' -and Enabled -eq '$false'"
  • @mklement0 如果不赞美你,我就无法阅读你的作品,在这种情况下,你关联答案的能力非常棒。它确实使对话更加健壮。在实践中,我没有发现-Filter 'Enabled -eq $true' 有任何问题,而且我经常使用它!但是,这不是第一次被忽视,所以我继续进行重新测试。我从-Filter 得到的结果与使用Where 进行后过滤时得到的结果相同。我通过-Filter * 获得了更多结果。这似乎是说-Filter 'Enabled -eq $true' 有效!
  • @mklement0 - 请参阅下面的最终脚本。我确实使用了 Steven 逻辑并更改了脚本,所以它给了我需要的结果 'Import-CSV -Path "c:\temp\export1221.csv" |选择对象@{Label = 'Enabled';表达式 = { ( Get-ADUser $_.samAccountName ).Enabled } } ,samAccountName | Export-CSV -Path "c:\temp\Output88.csv" -NoTypeInformation ' 结果如下所示 启用 samAccountName TRUE samAccountName1 TRUE samAccountName2 FALSE samAccountName3 TRUE samAccountName4
  • @mklement0 我确实及时对其他答案发表了评论。对不起,我忘了在这里提及。

标签: powershell active-directory export-to-csv


【解决方案1】:

你有几个问题:

  1. 您正在从Import-Csv 管道到ForEach-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 运算符来检查帐户是否已启用。再次添加“启用”属性需要做一些额外的工作。

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

【讨论】:

  • 谢谢,史蒂文,我将 CSV 文件的标题从 SIP 更改为 MAIL,并确保 excel 列有邮件(电子邮件)并且每个单元格中没有空格,但我在下面收到此错误: Get-ADUser:无法验证参数“身份”上的参数。参数的 Identity 属性为 null 或空。在 line:2 char:1 + Get-ADUser -Properties mail | + CategoryInfo : InvalidData: (@{LineUri=tel:+...fe-den.hds.com}:PSObject) [Get-ADUser],ParameterBindingValidationException+FullyQualifiedErrorIdParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.GetADUser。请指教
  • 一旦您通过管道传输到 Get-ADUser,每个后续 cmdlet 都会使用 Get-ADUser 的输出,而不是 csv 文件。也就是说,我想我更好地理解你想要做什么。让我再举一个例子。 CSV 数据样本会很有帮助!
  • -Identity 参数是按值。我已经纠正了这些例子。为我“认为”您正在尝试做的事情添加了其他示例。
  • 谢谢,史蒂文这是唯一可以在最后工作的版本。非常感谢您的所有帮助:'Import-CSV -Path "c:\temp\export1221.csv" |选择对象@{Label = 'Enabled';表达式 = { ( Get-ADUser $_.samAccountName ).Enabled } } samAccountName |导出-CSV -Path "c:\temp\Output3.csv" -NoTypeInformation '
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多