Das Problem in zu komplex foreach-Schleife liegt und schlecht gefilterten Abfrage. Werfen wir einen genaueren Blick darauf werfen:
Search-ADAccount -AccountExpired | foreach { # 1
get-aduser -Filter 'description -like "*leaver*"' # 2
}
Im Teil # 1, eine Liste aller Benutzer- und Computerkonten erhalten werden, die abgelaufen sind. So weit, ist es gut.
In Teil # 2 übergeben Sie nacheinander jedes abgelaufene Konto in der Pipeline. Nun, für alle abgelaufenen Konto gefunden, suchen Sie AD für alle Benutzerkonten, die Beschreibung enthalten Zeichenfolge leaver
. Das ergibt überhaupt keinen Sinn. (Was noch schlimmer ist, erfordert das Lesen der Beschreibung jedes Objekts.)
Als ein konkretes Beispiel mit 100 abgelaufenen Konten und 1000 AD-Benutzerkonten führt die Schleife 100 * 1000 Suchvorgänge durch. Hoppla! Kein Wunder, es scheint ewig zu dauern.
Als Arbeits Alternative betrachten so etwas wie so (nicht auf einer realen Domäne getestet, so YMMV),
$expiredAccounts = Search-ADAccount -AccountExpired # 1
$expiredAccounts| foreach { # 2
get-aduser -Filter {samaccountname -eq $_.samaccountname -and description -like "*leaver*"} # 3
}
Im Teil # 1, die abgelaufenen Konten in einer Variablen speichern. Dies macht keinen Unterschied, aber wenn diese später benötigt werden, müssen Sie das AD nicht erneut durchsuchen.
In Teil # 2 führt die Rohrleitung weiter. Nichts Wichtiges hier.
Im Teil # 3, suchen Sie die AD mit viel effektiver Filterung.
Sie sind ein Lebensretter! Vielen Dank! Funktioniert perfekt! –