Search Active Directory Powershell-使用.csv用户列表的全林搜索脚本
我正在寻求帮助,希望没有人会因为我无知而责骂我。 不久前,我成了一名广告管理员,组织规模很大,任务也不尽相同。在大多数情况下,我可以通过Powershell或管理单元轻松完成我需要的内容。 然而,我手头有一项任务超出了我的“创造力”。我在.csv中有一个超过10000个用户的列表,如果他们存在,我需要在本地广告中查找。我的两个问题是: -我对编写脚本非常陌生,越来越感到沮丧,因为我无法理解它,无法使我的脚本按我需要的方式工作 -这个任务和其他职责的截止日期给了我很少的时间来阅读更多关于脚本基础知识和学习的内容。因此,在大多数情况下,我不得不在web上查找脚本片段,并对其进行一些修改以满足我的需要。直到现在,我手上的剧本对我来说有点太复杂了 到目前为止,我面临的最大问题是创建一个森林范围的搜索。我的组织有一个根域和4个子域。运行简单的foreach循环时,如下所示:Search Active Directory Powershell-使用.csv用户列表的全林搜索脚本,search,powershell,csv,active-directory,subdomain,Search,Powershell,Csv,Active Directory,Subdomain,我正在寻求帮助,希望没有人会因为我无知而责骂我。 不久前,我成了一名广告管理员,组织规模很大,任务也不尽相同。在大多数情况下,我可以通过Powershell或管理单元轻松完成我需要的内容。 然而,我手头有一项任务超出了我的“创造力”。我在.csv中有一个超过10000个用户的列表,如果他们存在,我需要在本地广告中查找。我的两个问题是: -我对编写脚本非常陌生,越来越感到沮丧,因为我无法理解它,无法使我的脚本按我需要的方式工作 -这个任务和其他职责的截止日期给了我很少的时间来阅读更多关于脚本基础知
ForEach ($User in (Import-Csv c:\users\public\users.csv))
{ If (Get-ADUser $User.mail -server GLOBALCATALOGADDRESS:xxxx)
{ Write-Host "User found: $($User.mail)"
}
Else
{ Write-Host "User not found: $($User.mail)"
}
}
它只搜索我的计算机连接到的域。
因此,我设法找到并修改了一个全林搜索脚本,并得出以下结论:
#Get Domain List
$objForest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$DomainList = @($objForest.Domains | Select-Object Name)
$Domains = $DomainList | foreach {$_.Name}
$User = Import-CSV c:\users\public\users.csv
#Act on each domain
foreach($Domain in ($Domains))
{
Write-Host "Checking $Domain" -fore red
$ADsPath = [ADSI]"LDAP://$Domain"
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher($ADsPath)
#The filter
Foreach($mail in($User))
{
$objSearcher.Filter = "(&(objectCategory=user)(mail=$User.mail))"
$objSearcher.SearchScope = "Subtree"
$colResults = $objSearcher.FindAll()
foreach ($objResult in $colResults)
{
$objArray = $objResult.GetDirectoryEntry()
write-host $objArray.mail
}
}
}
该脚本的原始形式(在此处找到:)似乎很好,并且使用通配符和单个参数作为过滤器进行搜索。
然而,我不知道我遗漏了什么,让它搜索我在.csv中的每个电子邮件地址,并让它返回信息,无论是否找到了拥有此类邮件的用户。
脚本本身运行,但考虑到所需的时间和空白输出,它感觉好像只搜索一个用户。我100%确信,在on prem AD中至少存在一个列表中的用户。
欢迎提出任何建议。
谢谢你的关注
[编辑]
最后脚本:
#Get Domain List and load user e-mails from file
$objForest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$DomainList = @($objForest.Domains | Select-Object Name)
$Domains = $DomainList | foreach {$_.Name}
$Users = Import-CSV c:\users\public\users.csv
#Act on each domain
foreach($Domain in ($Domains))
{
Write-Host "Checking $Domain" -fore red
Foreach($mail in ($Users.mail))
{
Get-ADUser -filter {mail -eq $mail} -Server $domain -properties mail | select mail
}
}
帮自己一个忙,下载AD Powershell模块: 然后,您将能够简化代码并运行类似的操作,从而使任务更加清晰:
。。。
foreach($Domain中的域)($Domains))
{
写入主机“检查$Domain”-前红色
Foreach($mail-in($User.mail))
{
获取ADUser-filter{mail-eq$mail}-Server$domain-Properties-mail|
选择对象-扩展属性邮件
}
}
...
有关AD PS cmdlet的详细信息:使用
-LDAPfilter
&将-Server
指向GC
Get-ADUser -Server DC01.Contoso.com:3268
-Ldapfilter "(ObjectClass=user)(mailnickname=David)"
上述命令将在
GC
DC01.contoso.com
中搜索别名/邮件昵称为David的所有用户。足以联系域本身,而不是域的DC。因此,这也应该起作用
get-aduser -Filter {mailnickname -eq "David") -Server contoso.com:3268
谢谢你,英国皇家空军!它就像一个符咒。整个事情开始按预期进行,并逐一询问了所有域。对于任何可能在未来发现它有用的人;最后一个脚本返回默认的用户对象信息(邮件、名称、SamAccountName、SID等),而我只需要邮件。在同事的帮助下,我将Get ADUser设置为变量,然后使用write output$variable.mail只获取电子邮件地址。将最后一个脚本添加到我的主要问题中以供将来参考。没问题。如果只是查看修改后的答案后的邮件属性,则可以使用该格式提取任何必要的ldap属性。