【问题标题】:How do I stop my script from looping如何阻止我的脚本循环
【发布时间】:2017-06-07 19:50:53
【问题描述】:

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

我该如何阻止这种情况?

谢谢

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

【问题讨论】:

    标签: windows powershell server active-directory


    【解决方案1】:

    问题在于过于复杂的 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。

    【讨论】:

    • 你是救生员!谢谢!完美运行!
    猜你喜欢
    • 2020-08-05
    • 2012-12-10
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多