【问题标题】:Using Displaynames in txt file to get samaccountnames使用 txt 文件中的显示名称获取 samaccountnames
【发布时间】:2020-11-22 07:07:50
【问题描述】:

好的,我遇到了另一个问题,可能与无法正确存储值有关。最初的想法是获取用户列表并将他们的姓名分成两个值 - givenNamesn,以便 Get-ADUser cmdlet 能够通过 -Filter 选项使用它们。

虽然一个好主意并解决了,但我可能忽略了这样一个事实,即当人们有 2 个姓名或姓氏时,这并不是一个真正的选择,因为您无法轻松地将其预测为代码。我发现的另一个选项是属性displayName。由于我们的 displayNames 等于用户的全名,这将是最简单的选择。但是,我似乎无法成功地将 txt 文件中的值存储到变量中以使其工作。

我的代码目前如下所示:

Import-Csv -Path C:\temp\users.txt -header "displayName" |

ForEach-Object{ Get-ADUser -Filter "displayName -like '$($_.displayName)'" -Properties givenName, Surname, SamAccountName 
} |
Select-Object givenName, Surname, SamAccountName | 
Export-CSV C:\Temp\usersexport.csv -NoTypeInformation -Encoding UTF8
  1. txt 文件的结构如下:
John Smith Jones
Paula Ridley
Veronica Anne Downing
etc...

所以我们并不是真的在谈论 CSV 文件,而且用户的名字都在单独的一行中。

  1. 导入工作正常,我认为问题在于从文件中引入拾取值,它既不是实际的字符串,也不是-Filter 选项注册的原因。

  2. 在上面的代码中,我删除了一个用于存储值的变量,因为即使它存在也没有变化。

  3. 我也尝试指定-Delimiter "`n" 以在新的每一行上指定 txt 文件中的值的分隔,但要么我没有使用写入符号,要么它不起作用。 编辑:

运行代码后发生的问题是我导出的 CSV 文件只有以下条目:。我不知道为什么要说实话,无论如何它都不会改变,但是就像我说的那样,txt文件中名称的格式完全有可能是错误的。

如果我理解正确,-Filter 无论如何都会将给定的值运行到一个字符串中,所以我认为 txt 文件名在手之前没有被特别格式化的问题不是什么原因造成的。

【问题讨论】:

    标签: database powershell csv active-directory


    【解决方案1】:

    如果文件中的每一行都只是一个名称,那么最好只为该文件使用Get-Content 而不是Import-Csv

    Foreach-Object 循环没有接收到它的问题是您没有将循环与脚本的第一行连接起来,因此没有填充 $_ 管道变量。

    如果您希望使用 Import-Csv,您需要使用管道重构它,如下所示:

    Import-Csv -Path 'C:\temp\users.txt' -header "displayName" | ForEach-Object{ Get-ADUser -Filter 'displayName -like "$($_.displayName)"' -Properties givenName, Surname, SamAccountName }
    

    正如我所说,你也可以使用Get-Content,像这样:

    Get-Content -Path 'C:\temp\users.txt' | ForEach-Object{ Get-ADUser -Filter 'displayName -like "$_"' -Properties givenName, Surname, SamAccountName }
    

    或者:

    $DNames = Get-Content -Path 'C:\temp\users.txt' 
    ForEach ($DName in $Dnames){ 
    Get-ADUser -Filter 'displayName -like "$Dname"' -Properties givenName, Surname, SamAccountName 
    }
    

    请注意,变量扩展只发生在双引号内,而不是单引号内。

    【讨论】:

    • 失踪|是一个错字,我的错误。但是,您的代码似乎都不起作用。另外,我不完全确定我的措辞是否正确,所以稍微修正一下解释以使其更清楚。
    • 文件中的名称是否与有效的 AD 用户完全匹配?如果是这样,您可能想要使用 -eq 而不是 -like。如果不是,您需要在 Get-ADUser 过滤器中使用通配符。
    • 您的单引号过滤器不起作用 - 请参阅 stackoverflow.com/a/44184818/45375
    【解决方案2】:

    编辑:信不信由你,最愚蠢的事情 - displayName 在我的 txt 文件中的单独值之间没有“”,而是一个 TAB 空间,因为我从Excel 表并手动将它们连接在一起。我正在认真考虑聘请收缩师,因为我花了 5 个小时并没有注意到这一点。

    感谢@Laage 和@mklement0 的努力!

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多