我的任务是为我们的广告环境中的每个用户提供上次登录时间的报告,很明显,我首先向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分钟。
事物耦合脱颖而出,但这里最大的性能杀手可能是这两个语句: