【问题标题】:Why is my AD user-deletion script such a memory hog?为什么我的 AD 用户删除脚本如此占用内存?
【发布时间】:2015-10-03 00:36:57
【问题描述】:

我有另一个脚本将终止的用户移动到 Active Directory 中的“终止”OU。它在描述中添加注释,并将当前日期添加到“公司”字段中。然后,此脚本在该 OU 中查找超过 60 天的任何内容,并删除 AD 帐户,并删除其他服务器上的一些相关文件夹。

它往往运行速度很慢,并且在运行时会耗尽内存。任何人都可以看到会发生这种情况的任何原因吗?也许这不是最有效的方法?

提前感谢您的帮助!

Import-Module ActiveDirectory  

$users = Get-ADUser -SearchBase "ou=Terminated,dc=domain,dc=com" -Properties "company", "description" -Filter * | where {$_.description -like "Terminated*" }
$Date = Get-Date
$Today = $Date.DayOfYear
$CSVDate = Get-Date -Format yyyy-MM-dd
$TermList = @()

foreach($user in $users)
{
$DN = $user.DistinguishedName
$Homefolder = ("\\v12-dfs-home\homefolders$\" + $user.samaccountname)
$Profile = ("\\v12-dfs-pro\XA65Profiles\" + $user.samaccountname)
$Desktop = ("\\v12-dfs-home\desktops\" + $user.samaccountname)
$Term = $user.company
$Result = ($Today - $Term)
$altResult = ($Today + 365) - $Term

    If ($Result -gt 60)
        {
            $TermList += $user | %{Get-ADUser $_.DistinguishedName -properties displayName, employeeID, samaccountname, title, Description | select displayName, employeeID, samaccountname, title, Description}
            Remove-ADUser -Identity $DN -Confirm:$false
            Remove-Item $Homefolder -Force -Recurse -ErrorAction SilentlyContinue -Confirm:$false
            Remove-Item $Profile -Force -Recurse -ErrorAction SilentlyContinue -Confirm:$false
            Remove-Item $Desktop -Force -Recurse -ErrorAction SilentlyContinue -Confirm:$false
        }
    ElseIf ($Result -lt 0)
        {
            If ($altResult -gt 60)
                {
                    $TermList += $user | %{Get-ADUser $_.DistinguishedName -properties displayName, employeeID, samaccountname, title, Description | select displayName, employeeID, samaccountname, title, Description}
                    Remove-ADUser -Identity $DN -Confirm:$false
                    Remove-Item $Homefolder -Force -Recurse -ErrorAction SilentlyContinue -Confirm:$false
                    Remove-Item $Profile -Force -Recurse -ErrorAction SilentlyContinue -Confirm:$false
                    Remove-Item $Desktop -Force -Recurse -ErrorAction SilentlyContinue -Confirm:$false
                }
        }

}


# Output CSV of accounts being deleted
$TermList | Export-Csv c:\Results\Deleted_$CSVDate.csv -NoType

【问题讨论】:

  • 在任何给定时间,终止的 OU 中可以有多少用户?是文件删除部分需要时间吗?做我的猜测
  • @Matt 终止的 OU 中通常有 100-200 个用户,当脚本搜索超过 60 天的用户时,它通常会返回大约 15-30 个左右。这可能是文件删除部分需要时间,但这是否会占用我正在运行脚本的服务器上的所有内存?
  • 不要构建数组。获取对象并传递给ForEach-Object 来处理每一个。另一种说法是利用管道。

标签: powershell active-directory


【解决方案1】:

Active Directory 检索大数据可能会出现问题。尝试时要小心:

  • 检索用户信息(如果没有更多 RAM 可用于存储数据,可能会使用所有 ram 并导致命令失败(例如:This article
  • ForEach 循环会再次消耗大量 RAM,具体取决于您处理的数据量。

我可能是错的,但这是您代码中仅有的两件事可能会减慢您的脚本并消耗您的 RAM。

这里有一些最佳实践

理想的 PowerShell 脚本:

  • 不保留整组对象,而是在检索时逐个处理。
  • 只检索它需要的属性。
  • 在检索期间过滤对象。

【讨论】:

    猜你喜欢
    • 2011-06-24
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多