【问题标题】:Error with Get-ADUser: Invalid enumeration contextGet-ADUser 出错:枚举上下文无效
【发布时间】:2015-06-17 00:55:29
【问题描述】:

我前几天发布了这个问题 Extract e-mail from grouped objects

$OuUser = @{}

$OuUser = Get-AdUser -Properties * -Filter * -SearchBase "domain"   

$Duplicates = $OuUser | Select samaccountname, mail,UserPrincipalName |
    Group-Object Mail | Where{$_.Count -gt 1}

$Duplicates | Select Name,Count,@{l='Accounts';e={($_.Group|Select -Expand samaccountname) -join ';'}} | 
    Export-CSV E:\Damo\Duplicates.csv -NoTypeInfo

代码在一个域上运行良好,针对 OU 中的一小部分用户进行测试。

在我要测试的域上进行测试时,其中有很多用户,此代码失败。 OU 中包含非电子邮件格式的电子邮件地址。它指向 Get-ADUser 的错误。

Get-ADUser : The server has returned the following error: invalid enumeration c
ontext.
At C:\scripts\CountEmailsDup.ps1:4 char:21
+ $OuUser = Get-AdUser <<<<  -Properties * -Filter * -SearchBase 'ou=external,o
u=user accounts,dc=bizdir,dc=nzpost,dc=co,dc=nz' -SearchScope OneLevel
    + CategoryInfo          : NotSpecified: (:) [Get-ADUser], ADException
    + FullyQualifiedErrorId : The server has returned the following error: inv
   alid enumeration context.,Microsoft.ActiveDirectory.Management.Commands.Ge
  tADUser

我不知道为什么我在一个域上收到此错误,而在另一个域上却没有。

【问题讨论】:

  • 您期望有多少用户?一次枚举太多用户可能会发生这种情况。您可以尝试使用-ResultPageSize 500Get-ADUser
  • 有超过 900,000 个帐户要处理,我正在尝试仅使用具有有效电子邮件地址的帐户并找到重复项然后导出到 csv。
  • 那么我会尝试我的第一条评论,看看它是否有帮助。组织中的每个人都有一个电子邮件地址吗?您可以使用-Filter 仅获取具有有效电子邮件地址的帐户,以减少您带回的数据集。
  • 这是有道理的,从 Active Directory 获取数据学到了很多东西。谢谢你。我现在正在使用 -Filter { mail - like "*"},它应该只给我带有电子邮件地址的帐户。有一些带有 123 和 .在它们中,所以我将不得不使用 length -gt 3 或其他东西来跳过它们。
  • 您不仅可以按-like "*" 过滤,还可以按-like "....*" 过滤,这只会返回mail 属性至少有4 个符号长的用户。

标签: powershell active-directory


【解决方案1】:

您在这里遇到的最大问题是您向Get-ADUser 提出了很多问题。根据您的评论,您正在吸引超过 900,000 个帐户。最重要的是,您正在提取这些用户的所有属性。那里有一种疯狂的感觉。

虽然我不太清楚你的错误意味着什么,但我知道每个得到它的人都会返回很多用户,而你显然是。缓解这种情况的第一步是使用-ResultPageSizeGet-ADUser。您的里程可能会有所不同,但您需要尝试返回的记录数。 500-1000 通常是一个好的开始。

我永远不会使用-Properties *,除非我正在拉一个用户并想查看所有内容。我强烈怀疑您是否在函数中使用了所有这些属性。为了效率,将自己限制在所需的范围内。您显然需要指定Mail

由于您基于mail 属性进行处理,另一件事是将结果限制为仅具有填充邮件属性的结果。根据您对

的评论,您可以做几件事过滤器,例如“”、“....”(来自 Vesper 的 cmets)或“@

有一些带有 123 和 .在它们中,所以我将不得不使用 length -gt 3 或其他东西来跳过它们。

对此不确定,我没有样本数据来测试理论,但使用管道也应该有所帮助,而不是保存结果只是为了在管道中使用它们。

Get-AdUser -Properties mail -Filter 'mail -like "*@*"' -SearchBase "domain" -ResultPageSize 1000 | 
    Group-Object Mail | 
    Where{$_.Count -gt 1} |
    Select Name,Count,@{l='Accounts';e={($_.Group|Select -Expand samaccountname) -join ';'}} | 
    Export-CSV E:\Damo\Duplicates.csv -NoTypeInfo

【讨论】:

  • 谢谢,这有助于使用 @ 缩小数据范围并将属性设置为仅邮件,有助于加快处理时间。
  • 谢谢。这里也有一些很棒的分析:social.technet.microsoft.com/wiki/contents/articles/…。从他们的输出来看,一个非常简单的解决方案可能是向SORT-OBJECT 添加一个管道,因为这将确保在传递之前从管道中提取所有数据/您可以在不添加变量的情况下将其滑入。
【解决方案2】:

我知道这是旧的,但它让我走上了正确的轨道,虽然我会添加到 cmets。该问题似乎与 DC 和超时有关。限制查询很有帮助,但并不总是一种选择。也可能是查询不是那么糟糕,但 DC 或基础设施状况不佳(我正在处理两者的组合)。 所以让它发挥作用。

  • 使用过滤器限制结果(不是 where-object)
  • 在列表中找到功能最佳的 DC 并使用 -server 指定它。
  • 设置较小的结果大小实际上有助于减少超时。我使用了 100 的结果大小并成功。任何超过默认值的东西都会导致概述的错误。我遇到了更小的结果大小起作用的场景。它似乎确实让事情变慢了,但总比失败要好。

【讨论】:

  • 您能否提供您建议的实际代码示例?这会澄清你的答案很多:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多