该Powershell代码片段的哪个部分需要很长时间才能运行?

问题描述 投票:1回答:1

我的任务是为我们的广告环境中的每个用户提供上次登录时间的报告,很明显,我首先向Google谷歌母亲询问了一些我可以重新利用的东西,但找不到能检查多个域控制器并协调其内容的东西。最后一个,如果超过了任意设置的日期/天数,则吐出。

这里是代码:

foreach ($user in $usernames) {
    $percentCmpUser = [math]::Truncate(($usernames.IndexOf($user)/$usernames.count)*100)
    Write-Progress -Id 3 -Activity "Finding Inactive Accounts" -Status "$($percentCmpUser)% Complete:" -PercentComplete $percentCmpUser
    $allLogons = $AllUsers | Where-Object {$_.SamAccountName -match $user}
    $finalLogon = $allLogons| Sort-Object LastLogon -Descending |Select-Object -First 1
    if ($finalLogon.LastLogon -lt $time.ToFileTime()) {
        $inactiveAccounts += $finalLogon
    } 
}

$usernames是大约6000个用户名的列表

$AllUsers是18000个用户的列表,它包含10个我想在最终报告中访问的不同属性。我得到它的方法是在我关心的特定OU中为所有用户命中20个左右的DC中的三个。最终脚本实际上是6k * 20,因为我确实需要点击每个DC来确保我不会错过任何用户的登录。

$time的计算方法:

$DaysInactive = 60
$todayDate = Get-Date
$time = ($todayDate).Adddays(-($DaysInactive))

每个变量都在脚本的其他地方使用,这就是为什么我将其分成这样的原因。

在您建议LastLogonTimestamp之前,有人告诉我它不够最新,当我问将复制时间更改为最新时,我被告知“不,不会发生”。

Search-ADAccount似乎也无法提供不活跃用户的准确视图。

我愿意接受所有有关如何使此特定代码段运行得更快的建议,或者如何使用不同的方法以在较短的时间内获得相同的结果。

截至目前,以特定OU击中所有用户的每个DC大约需要10-20秒/ DC,然后上述代码段需要30-40分钟。

powershell sorting search active-directory execution-time
1个回答
5
投票

事物耦合脱颖而出,但这里最大的性能杀手可能是这两个语句:

© www.soinside.com 2019 - 2024. All rights reserved.