2017-01-23 103 views
2

我正在对AD运行附加的脚本。我只需要脚本返回每个AD帐户一次,但它似乎在无限循环中运行。如何停止循环脚本

如何停止?

感谢

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

回答

4

问题在于过于复杂foreach循环和过滤不良查询中。让我们仔细看看:

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

在部分#1中,您将看到已过期的所有用户和计算机帐户的列表。到现在为止还挺好。

在零件#2中,您逐个传递管道上的每个过期帐户。现在,对于已过期帐户找到,您搜索AD为所有用户帐户描述包含字符串leaver。这完全没有意义。 (更糟糕的是,搜索子串需要读取每个对象的描述。)

作为一个具体示例,拥有100个过期帐户和1000个AD用户帐户,循环正在执行100 * 1000次搜索操作。哎呀!难怪它似乎需要很长时间。

作为工作的替代,可以考虑像这样(没有真实的域名测试,所以因人而异),

$expiredAccounts = Search-ADAccount -AccountExpired # 1 
$expiredAccounts| foreach { # 2 
    get-aduser -Filter {samaccountname -eq $_.samaccountname -and description -like "*leaver*"} # 3 
} 

在部分#1,保存过期的账户中的变量。这没有什么区别,但如果稍后需要这些,则不需要重新搜索广告。

在零件#2中,管道结果向前。这里没什么重要。

在零件#3中,用更有效的过滤搜索AD。

+0

你是一个拯救生命的人!谢谢!完美的作品! –