如何使用Powershell从电子邮件中获取samaccountname?

时间:2017-10-31 12:53:10

标签: powershell active-directory

我有一个包含大量电子邮件地址的.txt文件,我需要获取相应的登录名并将其导出到另一个文件中。

我写了一个看起来像这样的脚本:

_onPressButton(){
........
........
}

由于某种原因,我只得到一个空文件作为结果。 任何人都可以告诉我我做错了什么?

2 个答案:

答案 0 :(得分:2)

这里有几个问题,

您使用变量$_作为Get-ADUser命令中的电子邮件地址,但未对此进行定义,因为它仅在使用ForEach-Object的循环中使用。

您在foreach中使用相同的变量名称,因此第一个循环将覆盖循环的数组。

您正在为每个用户编写CSV文件。

试试这个:

Get-Content -Path "c:\users-input.txt" | %{ Get-ADUser -Filter {EmailAddress -eq $_} } | Select-Object SamAccountName | Export-CSV -Path "c:\users.csv"

答案 1 :(得分:2)

最后需要Export-Csv,这样就不会在循环的每次迭代中覆盖它。例如:

Get-Content "C:\Scripts\users-input.txt" |
  ForEach-Object { Get-ADUser -LDAPFilter "(mail=$_)" } |
  Select-Object sAMAccountName |
  Export-Csv "C:\Scripts\users-output.csv" -NoTypeInformation

这将创建一个只包含一列(sAMAccountName)的CSV文件。没那么有用。如果您只想要一个用户名列表,请使用Out-File,例如:

Get-Content "C:\Scripts\users-input.txt" |
  ForEach-Object { Get-ADUser -LDAPFilter "(mail=$_)" } |
  Select-Object -ExpandProperty sAMAccountName |
  Out-File "C:\Scripts\users-output.txt"

但是你有两个单独的文件没有很好的方法来关联它们而不需要再次迭代输入文件。也许更好的方法是创建一个包含mail和sAMAccountName属性的输出文件?

Get-Content "C:\Scripts\users-input.txt" | ForEach-Object {
  $mail = $_
  $user = Get-ADUser -LDAPFilter "(mail=$mail)"
  if ( $user ) {
    $sAMAccountName = $user.sAMAccountName
  }
  else {
    $sAMAccountName = $null
  }
  [PSCustomObject] @{
    "mail" = $mail
    "sAMAccountName" = $sAMAccountName
  }
} | Export-Csv "C:\Scripts\users-output.csv" -NoTypeInformation

更多的代码,但一个很好的好处。此输出文件包含mail和sAMAccountName。如果邮件查找失败,则该行上的sAMAccountName属性将为空。