gpt4 book ai didi

powershell - 延迟运行 Get-ADGroupMember

转载 作者:行者123 更新时间:2023-12-02 23:29:04 25 4
gpt4 key购买 nike

谁能告诉我为什么下面的代码块在更大的组中运行如此缓慢?当我为几个成员的组运行它时,它运行正常,但是当我为一个有 640 个成员的组运行时,例如,有时它运行成功,有时它超时。域 Controller 是“本地的”(即不通过 WAN 链接)。我已经从多台机器上尝试过,并得到了一些一致(不受欢迎)的结果。 Get-ADGroupMember 是否应该为少于 1000 个成员的组快速返回结果?我认为它会,但是我在这个问题上摸不着头脑。

Import-Module ActiveDirectory
$sw = [Diagnostics.Stopwatch]::StartNew()
Get-ADGroupMember -Identity cri-all_users | measure
$sw.Stop()
$sw.Elapsed

这是我的输出示例:
Count    : 641
Average :
Sum :
Maximum :
Minimum :
Property :

Ticks : 2268358861
Days : 0
Hours : 0
Milliseconds : 835
Minutes : 3
Seconds : 46
TotalDays : 0.00262541534837963
TotalHours : 0.0630099683611111
TotalMilliseconds : 226835.8861
TotalMinutes : 3.78059810166667
TotalSeconds : 226.8358861

这是我的 $PSVERSIONTABLE
PS C:\Windows\System32\WindowsPowerShell\v1.0> echo $PSVERSIONTABLE

Name Value
---- -----
PSVersion 3.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.18051
BuildVersion 6.2.9200.16628
PSCompatibleVersions {1.0, 2.0, 3.0}
PSRemotingProtocolVersion 2.2

我将不胜感激任何人对此提供的任何见解。我已经尝试在系统调用级别使用 Process Explorer/Process Monitor 进行调试并(未成功)附加调试器,但还没有走得太远。非常感谢您的帮助和您的时间。

最佳答案

如果运行 640 个成员需要 3 分钟,则问题可能不在于域 Controller 或 cmdlet 本身。根据您的测量,我们以大约 2.8 个用户/秒的速度运行,即使是一些最慢的 DC 也可以处理。您可以通过在中等规模的组上运行它来证明这不是问题,如果您击败 2.8 个用户/秒,那么问题不在于 DC。如果您的 CPU 没有被固定在 100%,您也可以证明这一点......

由于您可以调查的几个原因,我已经看到这个问题突然出现:

  • 在组进行迭代时,它会尝试将 SID 解析为不存在的 Active Directory 对象。我会检查您的 Active Directory 以确保没有丢失或损坏的 AD 用户/组。
  • 这也可能是因为无法解析的外国安全主体
  • 虽然这可能不是具体情况,但当您使用 -Recurse 参数调用 Get-ADGroupMember 时,可能需要相当长的时间来递归所有组。

  • 当您迭代大型组(如域用户)时,通常会出现这些问题,在这些组中,SID 更可能损坏,从而导致问题。每个损坏的 SID 都会导致 Get-ADGroupMember cmdlet 在尝试解析 SID 时暂停,在超时之前等待 10-30 秒,然后继续。

    解决方法是找到那些坏的 SID。一种解决方法是获取信息的不同方法,例如使用目录搜索器:
    $searchRoot = New-Object System.DirectoryServices.DirectoryEntry
    $adSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $adSearcher.SearchRoot = $searchRoot

    $adSearcher.Filter = "(cn=groupName)"

    $adSearcher.PropertiesToLoad.Add("member")
    $samResult = $adSearcher.FindOne()

    if($samResult)
    {
    $adAccount = $samResult.GetDirectoryEntry()
    $groupMembership = $adAccount.Properties["member"]
    $groupMembership | foreach { Write-Host $_ }
    }

    关于powershell - 延迟运行 Get-ADGroupMember,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20958334/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com