【问题标题】:Import a list of emails (.csv), cycle through each email and provide appropriate Get-ADuser properties and export导入电子邮件列表 (.csv),循环浏览每封电子邮件并提供适当的 Get-ADuser 属性并导出
【发布时间】:2018-06-03 10:07:28
【问题描述】:

我有一种情况,我需要在 .csv 中获取电子邮件列表,导入列表并从 Active Directory 中提取适用的属性(通过 GetAD-User?)。

以下是我估计的流程:

  1. 导入 .csv 电子邮件列表
  2. 使用循环遍历每一行。
  3. 通过管道将数据传送到 Get-ADUser(通过 -filter)并返回相应的属性。

这是一个用于测试目的的示例列表(另存为:csv_file.csv):

abc@abc.com
1abc@abc.com
a2bc@abc.com
a3bc@abc.com
a4bc@abc.com
ab5c@abc.com

这是我的代码:

    $Name = @()

    Get-Content -path "C:\Location\Of\Sample\Input\csv_file.csv" |

    ForEach-Object {
    Get-ADuser  -filter * -properties 
    Mail, DisplayName, Department, Office | Select DisplayName, Department, 
    Office
}

当我运行此程序时,我会收到一份所有 AD 用户的列表,其中包含我的示例 csv_file.csv 中列出的每个电子邮件行。

我的问题: 1. 如何只显示我的 csv 文件中列出 Mail 属性的用户?例如,我列出了 6 封电子邮件,我应该只显示与这 6 个地址关联的属性。 2. 如何将 .csv 中列出的值与 Get-ADUser 中的 .Mail 属性进行比较?

示例输出: 超过 60k+ 显示名称、部门、办公室记录!

我似乎很难理解 powershell 中的循环约束和过滤器。我确定我的问题的根源是 -filter *,但它应该是什么?如何适当地遍历每个地址?我参考了其他一些帖子,但似乎无法确定任何特定于这种情况的内容。 非常感谢建设性的批评。 感谢您的帮助!

【问题讨论】:

  • 您被截断的代码似乎不完整 (?)。
  • @s-m-e,嗯。对不起。我认为问题在于 -properties 条目后的中断。请删除该换行符并在同一行上运行属性?这样做之后,一旦给出了适当的文件路径,它似乎就可以工作了。
  • 您在运行 Exchange 吗?
  • @mjolinor。是的。谢谢。

标签: powershell csv foreach scripting


【解决方案1】:

这应该会给你你正在寻找的结果。需要注意的一点是,我使用了“EmailAddress”而不是“Mail”,然后过滤了当前的 EmailAddress。

Get-Content -path "C:\Location\Of\Sample\Input\csv_file.csv" | 

ForEach-Object {
    Get-ADUser -Filter 'EmailAddress -eq $emailAddress' -Properties Department, DisplayName, EmailAddress | Select-Object DisplayName, Department, Office
}

【讨论】:

  • 您好罗伯特,感谢您的帮助!当我尝试您的查询时,我收到一条错误消息,指出:Get-ADUser : Invalid type 'System.Object[]'。参数名称:mail At line:6 char:5 有什么想法吗?我什至没有看到参数:邮件,在任何地方列出?
  • 你能分享你更新的代码吗?这似乎表明您可能仍然有“邮件”,而您应该有“电子邮件地址”。
  • 嗨罗伯特,请忽略上面列出的邮件评论。我试图进一步排除故障,最终取消了脚本并直接返回您的建议。现在,我运行了您推荐的代码,但收到以下错误:Get-ADUser : Variable: 'emailAddress' found in expression: $emailAddress is not defined。在 line:6 char:21 话虽如此,我想可能是因为 $emailAddress 没有在任何地方声明?我添加了 $emailAddress = @() 来创建一个空白数组,现在收到错误:
  • Get-ADUser:无效类型“System.Object[]”。参数名称:mail At line:6 char:21
  • 我使用的代码是: $Name = @() $EmailAddress = @() Get-Content -path "C:\List\csv_file.csv" | ForEach-Object {Get-ADUser -Filter 'EmailAddress -eq $emailAddress' -Properties Department, DisplayName, EmailAddress | Select-Object DisplayName, Department, Office } 我的示例文件以电子邮件形式列出,每行一个(没有标题):abc@abc.com 1abc@abc.com a2bc@abc.com a3bc@abc.com a4bc@abc .com ab5c@abc.com
【解决方案2】:

如果您正在运行 Exchange,这会更快:

Get-Content -path "C:\Location\Of\Sample\Input\csv_file.csv" |
  Get-Recipient |
  Select DisplayName,Department,Office

AD 不使用电子邮件地址作为索引身份参考,因此它必须在整个目录中搜索它循环通过的每个地址。 Exchange 使用并维护自己的用户数据库,以电子邮件地址作为索引,因此它可以直接提取电子邮件地址,无需过滤。 Get-Recipient cmdlet 返回包含您要查找的属性的对象。

【讨论】:

  • @Mjolinor,感谢您的演练。当我尝试运行该命令时,我收到一条错误消息,指出“Get-Recipient”未被识别为 cmdlet 的名称。也许我们的组织没有使用 Exchange?
  • 您需要从 Exchange 命令行管理程序或通过远程管理会话运行它。如果您不确定自己是否在运行 Exchange,请咨询您的电子邮件管理员。
  • 谢谢。我会联系我的管理员,看看这是否可行。
猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
相关资源
最近更新 更多