Я тоже испытал это с кодом, который перебирает тысячи учетных записей. Проблема в том, что у сборщика мусора нет времени на очистку в l oop, поскольку ваш код постоянно что-то делает. В. NET, я бы вызвал .Dispose()
вручную, чтобы убедиться, что вещи очищены, но здесь вы не можете.
Вы можете попробовать вызвать [System.GC]::Collect()
после назначения каждой переменной в l oop. Например, после $MembersArr =
и после $ADObj =
(надеюсь) заставить его освободить память, использованную для предыдущего значения.
Кроме того, я думаю, что строка $UserObj = Get-ADObject...
должна вызывать Get-ADUser
, а не Get-ADObject
. Таким образом, $UserObj.Enabled
никогда не будет иметь значения, и ваш continue
никогда не будет поражен.
Но вы можете полностью сэкономить на использовании Get-ADUser
, запросив userAccountControl
значение в Get-ADObject
и использование его для определения, отключен ли пользователь. Например:
$ADObj = Get-ADObject -filter {DistinguishedName -eq $Member} -Properties userAccountControl
# Clean up the old $ADObj value
[System.GC]::Collect()
#// Initialize regex variable
$matches = ""
if ($ADObj.ObjectClass -eq "user") {
$match = $ADObj -match '\([a-zA-Z0-9]+\)'
$empid=$matches[0] -replace ".*\(","" -replace "\)",""
if ($ADObj.userAccountControl -band 2) {
continue
}
$Members = $empid
}
Проверка состояния $ADObj.userAccountControl -band 2
является побитовым И сравнение для проверки, установлен ли второй бит значения userAccountControl
, что означает, что учетная запись отключена.