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

时间:2014-01-15 16:12:38

标签: powershell active-directory

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

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

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

我认为必须有一种更快的方法来实现这一点,因为我能够在我试图匹配的属性上猛烈关注并在一分钟左右的时间内获得每个ID的响应,而不是20分钟。运行where-object需要它。有什么建议吗?

一些注意事项:

我已经预处理了来自文件的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}
    }

3 个答案:

答案 0 :(得分:4)

我首先做一个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(如果它在表中)。

答案 1 :(得分:2)

此脚本创建HashTable个用户,然后只需将CSV文件中的employeeID与HashTable的{​​{1}}属性进行比较。 比为每次迭代调用Keys更有效。

Where-Object

答案 2 :(得分:0)

这里最快的方法是根据两者中的employeeID字段加入两个对象$ csv和$ users。我有自己的名为JoinObjects的函数,除非我想遇到麻烦,否则我无法分享。但是,下面的博客文章有一个几乎和我一样的例子。

http://blogs.msdn.com/b/powershell/archive/2012/07/13/join-object.aspx