powershell - 搜索帐户时获得更好的性能

标签 powershell active-directory

我正在尝试找到一种有效的方法来查询 ActiveDirectory 中的大量用户帐户,但我遇到了一些问题。

我有一个脚本,它遍历从另一个员工管理程序导出的文件,获取员工 ID,然后我在 ActiveDirectory 中搜索该文件。每个用户帐户都有一个关联的员工 ID,我使用是否在 A/D 中找到某个 ID 来显示是否应该创建或删除帐户(如果在文件中但不是 A/D,则创建;如果在 A/D但不是文件,删除)。我的问题是我找不到有效的方法来做到这一点。

我的旧方法是使用 Get-ADUser 一次搜索每个employeeID,但这非常慢。我也尝试拉下所有非系统帐户,然后使用列表中的 Where-Object 过滤掉匹配的帐户。对于大量帐户,这也会变得非常缓慢,因为 Where-Object 正在检查我的帐户数组中的每个帐户。

我认为必须有一种更快的方法来做到这一点,因为我能够在我尝试匹配的属性上猛击一个 -contains 并在一分钟左右内获得每个 ID 的响应,而不是 20它需要运行一个 where 对象。有什么建议吗?

一些注意事项:

我已经对来自文件的 ID 和 ActiveDirectory 中的 ID 进行了预处理,以确保没有重复,所以只获得第一个结果就可以了。

旧方法(简化处理代码):

$csv = Import-CSV -Path $someFile
Foreach($line in $csv){
    $DoesAccountExist = Get-Aduser -filter {employeeID -eq $line.employeeID}
    }

内存法:

$csv = Import-CSV -Path $someFile
$Users = Get-Aduser -filter *
$NonSystemUsers = $users | Where-Object {$_.employeeID -match $employeeIDPattern}

#This is the part that is slow
foreach($line in $csv){
    $DoesAccountExist = $NonSystemUsers | Where-Object {$_.employeeID -eq $line.employeeID}
    }

最佳答案

我会先对 AD 进行一次批量查询,然后构建一个哈希表(Key = EmployeeID,Value = DN),然后再从它开始工作。

$hash = @{}

Get-ADUser -Properties EmployeeID -Filter * |
 foreach {$hash[$_.EmployeeID] = $_.DistinguishedName}

 $csv = Import-CSV -Path $someFile
 Foreach($line in $csv){
  $DoesAccountExist = [bool]($hash[$line.employeeid])
}

$hash[$line.employeeid] 将返回属于该employeeid 的用户的DN(如果它在表中)。

关于powershell - 搜索帐户时获得更好的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21142487/

相关文章:

powershell - 获取当前目录下子文件夹中文件的相对路径

Powershell- "Clear-Item variable:"与 "Remove-Variable"

c# - 目录搜索过滤器

powershell - 过滤 cmd 命令的输出,而无需使用中间文件

powershell - 寻找与特定 awk 命令等效的 powershell

powershell - 脚本完成后有两个变量,但是当我通过管道传输到 SELECT 对象时,只有第一个将数据返回到控制台

Azure Active Directory SSO - 帐户映射

c# - 记录集只返回 1000 条记录

azure - 事件目录 : Do I need to register both native app and web app in azure or can I use 1 registered app for both?

active-directory - 从 Azure 应用服务访问网络中的本地 AD