0

我有一个包含 100 个用户的记事本列表。通常我使用下面的脚本来获取一个 OU 中的所有用户,但这次我有来自不同 OU 的用户,我必须使用 Samaccountname 进行搜索。

clear 
 $UserInfoFile = New-Item -type file -force "C:\Scripts\UserInfo.txt"  
"Login`tGivenname`tEmail" | Out-File $UserInfoFile -encoding ASCII 
 Import-CSV "C:\Scripts\OU.txt" | ForEach-Object { 
  $dn = $_.dn 
  $ObjFilter = "(&(objectCategory=User)(objectCategory=Person))" 
  $objSearch = New-Object System.DirectoryServices.DirectorySearcher 
  $objSearch.PageSize = 15000 
  $objSearch.Filter = $ObjFilter 
  $objSearch.SearchRoot = "LDAP://$dn" 
  $AllObj = $objSearch.FindAll() 
foreach ($Obj in $AllObj) 
      { $objItemS = $Obj.Properties 
             $Ssamaccountname = $objItemS.samaccountname 
             $SsamaccountnameGN = $objItemS.givenname 
             $SsamaccountnameSN = $objItemS.sn 
             $SsamaccountnameEN = $objItemS.mail
             "$Ssamaccountname`t$SsamaccountnameGN`t$SsamaccountnameSN`t$SsamaccountnameEN" | Out-File $UserInfoFile -encoding ASCII -append 
      } # End of foreach
   } # End of ForEach-Object 

我正在尝试使用 samaccountname 列表来获取这些用户的姓名和电子邮件。我是 Powershell 的新手,所以上面的脚本本身对我来说有点难以掌握,现在我的任务更加艰巨。

4

2 回答 2

0

不确定我是否正确理解了您的问题,但如果您想按帐户名称过滤用户列表,您可以执行以下操作:

$accounts = Get-Content userlist.txt

...

$objSearch.FindAll() | ? {
  $accounts -contains $_.Properties.sAMAccountName
} | % {
  "{0}`t{1}`t{2}" -f ($_.Properties.givenname, $_.Properties.sn, $_.Properties.mail)
}

顺便说一句,如果可能,我建议使用ActiveDirectoryPowerShell 模块。这将允许您使用简单的 检索用户帐户Get-ADUser,从而简化您的代码。通过在第一个逗号处拆分 dn,可以从用户的专有名称中提取 OU。像这样的东西:

$accounts = Get-Content userlist.txt
Get-ADUser * -Properties * | ? {
  $accounts -contains $_.Properties.sAMAccountName
} | select @{n="ou";e={($_.distinguishedName -split ",", 2)[1]}}, mail, givenName, sn, homeDirectory

或像这样:

Get-Content userlist.txt | Get-ADUser -Properties * |
  select @{n="ou";e={($_.distinguishedName -split ",", 2)[1]}}, mail, givenName, sn, homeDirectory

不过,未经测试,因为我手头没有广告。

于 2013-05-14T16:53:26.483 回答
0

我现在无法测试它,但试一试。如果您知道用户的 DN,则无需搜索 AD。您可以使用 DN 直接绑定到它。

Import-CSV "C:\Scripts\OU.txt" | ForEach-Object { 
    $dn = $_.dn 
    $user = [adsi]"LDAP://$dn" 

    New-Object PSObject -Propertry @{ 
        samaccountname = $user.Properties['samaccountname']
        givenname = $user.Properties['givenname']
        sn = $user.Properties['sn']
        mail = $user.Properties['mail']
    }

} | Export-Csv $UserInfoFile 
于 2013-05-14T16:58:13.207 回答