我正在针对我的AD运行附加的脚本。我只需要脚本一次返回每个AD帐户,但它似乎在无限循环中运行。
如何阻止此事?
由于
Search-ADAccount -AccountExpired | foreach { get-aduser -Filter 'description -like "*leaver*"' }
答案 0 :(得分:4)
问题在于过于复杂的foreach循环和过滤不良的查询。让我们仔细看看:
Search-ADAccount -AccountExpired | foreach { # 1
get-aduser -Filter 'description -like "*leaver*"' # 2
}
在第1部分中,您将获得已过期的所有用户和计算机帐户的列表。到目前为止一切都很好。
在#2部分中,您将逐个传递管道上的每个过期帐户。现在,对于找到的每个过期帐户,您搜索AD以查找包含字符串leaver
的描述的所有用户帐户。这毫无意义。 (更糟糕的是,搜索子字符串需要阅读每个对象的描述。)
作为具体示例,拥有100个过期帐户和1000个AD用户帐户,循环正在进行100 * 1000次搜索操作。哎呀!难怪它似乎需要很长时间。
作为替代方案,请考虑类似的事情(未在真实域上测试,因此YMMV),
$expiredAccounts = Search-ADAccount -AccountExpired # 1
$expiredAccounts| foreach { # 2
get-aduser -Filter {samaccountname -eq $_.samaccountname -and description -like "*leaver*"} # 3
}
在第1部分中,将过期的帐户保存在变量中。这没有区别,但如果以后需要这些,则无需重新搜索AD。
在第2部分中,管道结果向前。这里没什么重要的。
在第3部分中,使用更有效的过滤搜索AD。