我有这个脚本工作正常(输出看起来不错),但现在需要超过12个小时。 csv中有34220条记录,现在只有2110条记录。也许我需要先加载所有用户数据,然后再与csv文件进行比较?求救......
import-module ActiveDirectory
$CCure = Import-csv C:\Scripts\CCure\CCure-Personnel-enabled.csv
ForEach ($Row in $CCure) {
[string]$ID = $Row.ObjectID
[string]$Name = $Row.Name
[string]$EmpID = $Row.Int5
If ($EmpID.Trim() -ne "0") {
$User = Get-ADUser -LDAPFilter "(&(&(&(objectclass=user)(objectcategory=person)(!userAccountControl:1.2.840.113556.1.4.803:=2))))((employeeId=*$EmpID))" -SearchBase 'DC=Enterprise,DC=mycompany,DC=org' -Properties SamAccountName,DisplayName,EmployeeId,enabled |
Select @{Name="CCure ObjectID";Expression={$ID}},SamAccountName,DisplayName,@{Name="CCure Name";Expression={$Name}},EmployeeId,@{Name="CCure Int5 Row";Expression={$EmpID}},enabled | Export-csv c:\scripts\ccure\EmployeeIds4-10-2016.csv -NoTypeInformation -append
}
}
答案 0 :(得分:2)
也许我需要先加载所有用户数据,然后再与csv文件进行比较?
完全 你需要做什么!
由于您希望通过EmployeeId
属性关联CSV中的用户,因此建议您删除已填充EmployeeId
的所有(已启用)用户,然后将其存储在哈希表中,EmployeeId
用作键:
$ADUserTable = @{}
Get-ADUser -LDAPFilter "(&(!userAccountControl:1.2.840.113556.1.4.803:=2)(employeeId=*))' -SearchBase 'DC=Enterprise,DC=mycompany,DC=org' -Properties SamAccountName,DisplayName,EmployeeId |ForEach-Object {
$ADUserTable[$_.EmployeeId] = $_
}
然后,当您迭代CSV中的行时,在哈希表中查找用户而不是再次搜索AD:
$ExistingUsers = ForEach ($Row in $CCure) {
# Import-Csv always creates string properties anyways
$ID = $Row.ObjectID
$Name = $Row.Name
$EmpID = $Row.Int5.Trim()
if ($EmpID -ne "0" -and $ADUserTable.ContainsKeys($EmpID))
{
$ADUserTable[$EmpID] |Select @{Name="CCure ObjectID";Expression={$ID}},SamAccountName,DisplayName,@{Name="CCure Name";Expression={$Name}},EmployeeId,@{Name="CCure Int5 Row";Expression={$EmpID}}
}
}
在您收集完所有信息之前,请不要将它们导出到Csv - 否则您将打开,写入和关闭同一文件35000次!
所以,最后:
$ExistingUsers |Export-csv c:\scripts\ccure\EmployeeIds4-10-2016.csv -NoTypeInformation
这无疑会加快脚本的执行速度
注意:我已从Enabled
和Get-ADUser
删除了Select-Object
媒体资源。您的LDAP过滤器已经保证只返回已启用的用户,因此我没有看到将其添加到CSV中的任何值