【问题标题】:How can I compare CSV to AD users and disable users not in CSV?如何将 CSV 与 AD 用户进行比较并禁用不在 CSV 中的用户?
【发布时间】:2026-02-06 11:10:02
【问题描述】:

作为禁用用户的过程,我有一个 CSV,其中用户由员工 ID 而不是用户名标识。我需要遍历并将 CSV 与 AD 用户进行比较,并且需要禁用任何不在 CSV 中的 AD 用户。这是我到目前为止所拥有的,但它不起作用。我承认我对 powershell 脚本还很陌生,所以任何帮助都将不胜感激。

Import-Module ActiveDirectory  

Import-Csv -Path c:\ADTerm.csv | foreach {Get-ADUser -filter * -SearchBase "ou=Test,ou=Logins,dc=domain,dc=com" -Identity $_.employeeID} | Where {$_ -ne $null} | Disable-ADAccount -Identity $_.employeeID

【问题讨论】:

  • 你能提供一个csv内容的例子吗?我会选择用户名与员工的格式吗?不是真实数据只是示例数据。还有什么错误?此外,可能只是帖子中的错字,但您在第二行末尾缺少一个右花括号 } 以关闭 foreach
  • 嗨 Jarrod,请从该列表中选择一个用户,然后运行此命令。 Get-ADUser -Identity <random user's Employee ID>你能解析一个用户吗?
  • 忽略我对丢失大括号的评论,我看不懂;-)

标签: powershell csv active-directory


【解决方案1】:

如果不让它看起来很糟糕,我真的无法将这一切都放在评论中,所以让我们从这个开始吧。

您正在组合-Filter-Identity,这很可能不会获得您正在寻找的结果。使用身份来获取一个特定用户或使用过滤器来获取一对多。查看Get-AdUser 的 TechNet,您将看到 Identity 仅将值匹配到:

  • 专有名称
  • objectGUID
  • objectSid
  • sAMAccountName

在这方面,我看到您有一个EmployeeID 的专栏。我猜这些不是SamAccountName,这是-Identity 支持的值之一。我觉得您可以进行以下更改。

$IDs = Import-Csv -Path c:\ADTerm.csv | Select-object -ExpandProperty EmployeeID
Get-ADUser -filter * -SearchBase "ou=Test,ou=Logins,dc=domain,dc=com" -Properties EmployeeID | 
        Where-Object{$_.EmployeeID -and ($IDs -notcontains $_.EmployeeID)} | Disable-ADAccount

更新 get-aduser 以获取该 OU 中的所有用户。 Get-Aduser 默认不返回 EmployeeID,所以我们使用 -Properties 来指定它。过滤所有那些拥有employeeID 但不在列表中的用户。 Disable-ADAccount 将很好地获取Get-AdUser 的输出,因此无需再次指定帐户。

根据您的情况,您可能会将此值存储为 AD 中的 EmployeeNumber。这也取决于您是否拥有一个包含 EmployeeNumber 列的 csv 文件

【讨论】:

  • @BoogaRoo 感谢您注意到这一点。我现在做了一个懒惰的编辑。如果我们走在正确的轨道上,以后会有所改善。再次感谢。
  • 非常感谢现在完全有意义的帮助。除了我刚刚将“Disable-Account”更改为“Disable-ADAccount”之外,您发布的脚本有效。再次感谢!
最近更新 更多