为什么我的 AD 用户删除脚本如此占用内存?
Why is my AD user-deletion script such a memory hog?
我有另一个脚本可以将终止用户移动到 Active Directory 中的 "Terminated" OU。它在描述中添加注释,并将当前日期添加到 "Company" 字段中。然后此脚本会在该 OU 中查找超过 60 天的任何内容并删除 AD 帐户,并删除其他服务器上的一些相关文件夹。
它往往 运行 变慢并在 运行ning 时耗尽内存。任何人都可以看到发生这种情况的任何原因吗?也许这不是最有效的方法?
在此先感谢您的帮助!
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
活动目录检索大数据可能会出现问题。尝试时要小心:
- 检索用户信息(如果没有更多 RAM 可用于存储数据,可能会使用所有 ram 并使命令失败(示例:This article)
- ForEach 循环会消耗大量 RAM,这同样取决于您处理的数据量。
我可能错了,但您的代码中只有这两件事可能会减慢您的脚本速度并消耗您的 RAM。
这里有一些最佳实践
理想的PowerShell脚本:
- 不保留整个对象集,而是在检索时一个一个地处理它们。
- 只检索它需要的属性。
- 在检索期间过滤对象。
我有另一个脚本可以将终止用户移动到 Active Directory 中的 "Terminated" OU。它在描述中添加注释,并将当前日期添加到 "Company" 字段中。然后此脚本会在该 OU 中查找超过 60 天的任何内容并删除 AD 帐户,并删除其他服务器上的一些相关文件夹。
它往往 运行 变慢并在 运行ning 时耗尽内存。任何人都可以看到发生这种情况的任何原因吗?也许这不是最有效的方法?
在此先感谢您的帮助!
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
活动目录检索大数据可能会出现问题。尝试时要小心:
- 检索用户信息(如果没有更多 RAM 可用于存储数据,可能会使用所有 ram 并使命令失败(示例:This article)
- ForEach 循环会消耗大量 RAM,这同样取决于您处理的数据量。
我可能错了,但您的代码中只有这两件事可能会减慢您的脚本速度并消耗您的 RAM。
这里有一些最佳实践
理想的PowerShell脚本:
- 不保留整个对象集,而是在检索时一个一个地处理它们。
- 只检索它需要的属性。
- 在检索期间过滤对象。