我前几天发布了这个问题 Extract e-mail from grouped objects
public class Locality
{
public string category { get; set; }
public int id { get; set; }
public double latitude { get; set; }
public string location { get; set; }
public double longitude { get; set; }
public int postcode { get; set; }
public string state { get; set; }
}
public class Localities
{
public Locality locality { get; set; }
}
public class RootObject
{
public Localities localities { get; set; }
}
代码适用于一个正常运行的域,并针对OU中的一小部分用户进行测试。
在我要测试的域上测试时,其中有很多用户,此代码失败。 OU中包含电子邮件地址,但不是电子邮件格式。它指向错误的Get-ADUser。
$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
我很遗憾为什么我在一个域上收到此错误而不是另一个域。
答案 0 :(得分:2)
你在这里遇到的最大问题是你在Get-ADUser
提出了很多问题。根据您的评论,您将吸引超过900,000个帐户。最重要的是,您将拉动这些用户的所有属性。那里有一丝疯狂。
虽然我并不完全清楚你的错误意味着什么,但我知道每个获得它的人都会返回很多用户。缓解此问题的第一步是使用-ResultPageSize
Get-ADUser
。您的里程可能会有所不同,但您需要尝试返回的记录数量。 500-1000通常是一个良好的开端。
我永远不会使用-Properties *
,除非我为一个用户拉动并希望看到一切。我强烈怀疑你在你的函数中使用了所有这些属性。为了效率而限制自己需要的东西。您显然需要指定Mail
。
由于您正在基于mail
属性进行处理,因此另一件事情是将结果限制为仅具有填充邮件属性的结果。您可以做的一些事情过滤,例如“”,“.... ”(来自Vesper的评论)或“ @ ”基于您的评论
有一些电子邮件字段123和。在它们中,所以我将不得不使用长度-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