试图找到一种方法来加速这个PowerShell脚本

时间:2016-02-11 16:27:20

标签: powershell

我有这个脚本工作正常(输出看起来不错),但现在需要超过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

    }
    }

1 个答案:

答案 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

这无疑会加快脚本的执行速度

注意:我已从EnabledGet-ADUser删除了Select-Object媒体资源。您的LDAP过滤器已经保证只返回已启用的用户,因此我没有看到将其添加到CSV中的任何值