【问题标题】:Powershell foreach loop to query AD for users from a .csv filePowershell foreach 循环从 .csv 文件查询用户的 AD
【发布时间】:2021-12-23 17:48:44
【问题描述】:

Powershell 的初学者试图在我的帮助台工作中变得更有效率。本质上,我有一个 .csv 文件,其中包含我想用来查询 AD 以查看启用/禁用哪些帐户的电子邮件地址列表。到目前为止,我没有得到任何输出:

Import-Module ActiveDirectory
$emails = Import-Csv -Path "c:\users\me\mycsvfile.csv"
foreach($email in $emails) {
    Get-ADUser -Filter {userprincipalname -eq '$email.email'} | Select-Object name,enabled
}

.csv 文件有一个名为 email 的列的标题,这就是我使用“$email.email”的原因。任何人都知道我做错了什么(可能很多)。

非常感谢

【问题讨论】:

  • 首先选择一个已知良好的电子邮件,看看您的Get-ADUser 是否为该帐户返回任何内容。如果不是,则说明您的过滤器、权限或其他方面有问题。
  • 你能制作一个你的 csv 文件的小样本吗?如果你这样做,会有更多人给你答案。
  • 根据Get-ADUser的文档(“如果使用花括号括住过滤器,则根本不应该引用变量”),您的过滤器应该是{userprincipalname -eq $email.email}
  • 我们还没有收到您的来信.. 作为 SO 新手您可能不知道这一点,但习惯上点击左侧的 图标 accept the answer that best solved your problem .这将帮助其他有类似问题的人更轻松地找到它,并有助于激发人们回答您的问题。

标签: powershell foreach


【解决方案1】:

这些广告过滤器有点反复试验。

foreach($email in $emails) {
    $upn = $email.email
    Get-ADUser -Filter {userprincipalname -eq $upn} | Select-Object name,enabled
 }

name   enabled
----   -------
js     True

【讨论】:

    【解决方案2】:

    UserPrincipalName 属性可以与用户的电子邮件地址相同,但实际上它们是不同的属性。
    相似之处在于 UserPrincipalName (UPN) 是电子邮件地址格式的系统用户名。

    假设在您的域中,UPN 也是用户的电子邮件地址。

    我猜你的 csv 实际上是一个文本文件,每个电子邮件地址都在单独的行中,并且没有标题 email

    类似

    you@yourdomain.com
    him@yourdomain.com
    her@yourdomain.com
    someone.else@yourdomain.com
    

    在这种情况下,您要么需要使用Get-Content,因此您将获得所有地址(行)作为字符串数组并循环:

    Import-Module ActiveDirectory
    $emails = Get-Content -Path "c:\users\me\mycsvfile.csv"
    foreach($email in $emails) {
        Get-ADUser -Filter "UserPrincipalName -eq '$email'" | Select-Object Name, Enabled
    }
    

    或使用Import-Csv 并为其中的字段提供标题:

    Import-Module ActiveDirectory
    $emails = Import-Csv -Path "c:\users\me\mycsvfile.csv" -Header 'email'
    foreach($email in $emails) {
        Get-ADUser -Filter "UserPrincipalName -eq '$($email.email)'" | Select-Object Name, Enabled
    }
    
    • -Filter 参数实际上应该是一个字符串而不是脚本块
    • 在过滤器中使用object.property 语法时,需要用$() 将其括起来,使其成为一个子表达式,由PowerShell 解析为它包含的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2016-07-11
      • 2021-10-04
      • 1970-01-01
      相关资源
      最近更新 更多