2017-01-23 4 views
2

Ich führe das angehängte Skript gegen mein AD aus. Ich brauche nur das Skript, um jeden AD-Account einmal zurückzugeben, aber es scheint in einer Endlosschleife zu laufen.Wie verhindere ich, dass mein Skript eine Schleife durchläuft

Wie höre ich damit auf?

Dank

Search-ADAccount -AccountExpired | foreach { get-aduser -Filter 'description -like "*leaver*"' } 

Antwort

4

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.

+0

Sie sind ein Lebensretter! Vielen Dank! Funktioniert perfekt! –

Verwandte Themen