Active Directory Powershell - 使用.csv用户列表的林范围搜索脚本

时间:2014-05-20 08:45:53

标签: search powershell csv active-directory subdomain

我正在寻求一些帮助,希望没有人会因为无知而抨击我。 就在不久之前,我成了AD管理员,组织很大,所以任务各不相同。在大多数情况下,我可以通过Powershell或管理单元轻松完成我的要求。 但是我手上的任务超出了我的“创造力”。我有.csv中超过10 000个用户的列表,如果它们存在,我需要在本地AD中查找。我的两个问题是: - 我是一个非常新的脚本,越来越沮丧,我无法理解它,并使我的脚本工作,因为我需要他们 - 这项任务和其他职责的缺省使我没有多少时间阅读有关脚本基础知识和学习的更多信息。因此,在大多数情况下,我被迫在网上查找脚本片段并稍微修改它们以满足我的需求。这一直到现在为止,因为我手上的剧本对我来说有点过于复杂。

到目前为止,我面临的最大问题是创建一个全林搜索。我的组织有一个根域和4个子域。运行简单的foreach循环时,如下所示:

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 
    }
}
}

该脚本的原始形式似乎很好(在此处找到:http://powershell.nicoh.me/powershell-1/active-directory/forest-wide-object-searches)并且使用通配符和单个参数作为过滤器进行搜索。 但是我不知道我错过了什么来搜索我在.csv中的每个电子邮件地址,并使其返回信息,无论是否找到了这样的邮件的用户。 脚本本身运行,但考虑到它所花费的时间和空白输出,感觉它只搜索一个用户。我100%确定列表中至少有一个用户存在于本地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
    }
}

3 个答案:

答案 0 :(得分:2)

帮自己一个忙,下载AD Powershell模块:http://blogs.msdn.com/b/rkramesh/archive/2012/01/17/how-to-add-active-directory-module-in-powershell-in-windows-7.aspx

然后,您将能够简化代码并运行这样的事情,使您的任务更加清晰:

   
...
foreach($Domain in ($Domains))
{
    Write-Host "Checking $Domain" -fore red
    Foreach($mail in ($User.mail))
    {
        Get-ADUser -filter {mail -eq $mail} -Server $domain -Properties mail | 
        select-object -ExpandProperty mail
    }
}
...

有关AD PS cmdlet的更多信息:http://technet.microsoft.com/en-us/library/ee617195.aspx

答案 1 :(得分:0)

使用-LDAPfilter&将-Server指向GC

Get-ADUser -Server     DC01.Contoso.com:3268
           -Ldapfilter "(ObjectClass=user)(mailnickname=David)"

以上命令将在GC DC01.contoso.com中搜索其别名/ mailnickname为David的所有用户。

答案 2 :(得分:0)

足以联系域本身而不是域的DC。因此,这也应该起作用

get-aduser -Filter {mailnickname -eq "David") -Server contoso.com:3268