【问题标题】:Extracting first and last names from txt file and using it to get username from AD and import it into csv从 txt 文件中提取名字和姓氏,并使用它从 AD 获取用户名并将其导入 csv
【发布时间】:2020-08-01 13:16:42
【问题描述】:

作为一种测试和一种从 AD 获取特定数据的方法,我试图根据一个填充了用户姓名和姓氏的 txt 文件来获取数据。我发现使用ConvertFrom-Stringcmdlet 允许您将txt 文件中的名称拆分为两个单独的值,从而使您能够(理论上)使用Get-ADUser 从AD 及其属性中查找用户。

到目前为止,我使用的代码如下,在我尝试了各种选项以使其正常工作时,这里和那里都有随机变化。我已经能够通过将名称存储在变量下然后使用Get-ADUser cmdlet 从 AD 中获取它们来获取我需要的数据,我什至能够将该数据导出到 CSV 文件中。当有一个包含多个条目的文本文件时,问题是无法使其工作。

Get-Content C:\temp\users.txt -encoding UTF8 |
ConvertFrom-String |
ForEach-Object {Get-ADUser -Filter {(givenName -Like '$($_.P1)') -and (sn -Like '$($_.P2)')} -Properties *} |
Select-object givenName, Surname, SamAccountName | Export-CSV C:\Temp\usersexport.csv -NoTypeInformation

任何帮助将不胜感激。

【问题讨论】:

    标签: database string powershell csv active-directory


    【解决方案1】:

    您在非扩展字符串中使用子表达式。查看 Powershell 的 about_Quoting_Rules 帮助主题以获取更多详细信息。但是,简而言之,您需要双引号来扩展 $($_) 之类的内容。

    类似:

    Get-Content C:\temp\users.txt -encoding UTF8 |
    ConvertFrom-String |
    ForEach-Object {Get-ADUser -Filter "( givenName -like '$($_.P1)' ) -and (sn -like '$($_.P2)' )" -Properties *} |
    Select-object givenName, Surname, SamAccountName | Export-CSV C:\Temp\usersexport.csv -NoTypeInformation
    

    请注意,我引用了整个过滤器。从技术上讲,Get-ADUser-Filter 参数接受一个字符串,因此这是可以接受的,并且更易于阅读。

    另请注意:您可能需要“*”才能使其正常工作。从技术上讲,类似将适用于完全匹配,但它更常用于使用通配符进行搜索。在您的情况下,使用 '*$($_.P1)*' 可能会帮助您解决问题。

    如果您对这些值有信心,特别是考虑到您也在使用-and 运算符,您可能会考虑使用-eq。但是我会担心,因为总是有可能发生常见的名称冲突。例如在美国很容易有 2 个约翰史密斯在公元...

    我还要指出,为此使用 Import-Csv 更为方便。更正后,您的方法有效,但首先以下内容更具可读性且更易于编写:

    -eq 为例:

    Import-Csv -Path C:\temp\users.txt -header "givenName","sn" -Delimiter " " |
    ForEach-Object{
        $GivenName = $_.givenName
        $LastName  = $_.sn
        ForEach-Object { Get-ADUser -Filter "(givenName -eq '$GivenName') -and (sn -eq '$LastName')" -Properties * }
    } | 
    Select-Object givenName, Surname, SamAccountName | 
    Export-CSV C:\Temp\usersexport.csv -NoTypeInformation
    

    -like 和通配符的示例:

    Import-Csv -Path C:\temp\users.txt -header "givenName","sn" -Delimiter " " |
    ForEach-Object{
        $GivenName = $_.givenName
        $LastName  = $_.sn
        ForEach-Object { Get-ADUser -Filter "(givenName -like '*$GivenName*') -and (sn -like '*$LastName*')" -Properties * }
    } | 
    Select-Object givenName, Surname, SamAccountName | 
    Export-CSV C:\Temp\usersexport.csv -NoTypeInformation
    

    您可能还想避免使用-Properties *,而是定义一组更精确的属性来检索。在更大的工作中,这将产生性能差异。

    哦,您通常不需要为 Get-Content 指定编码,它非常擅长自行解决。

    在 PowerShell Core 中,参数的默认值为 UTF8NoBOM。 NoBOM 只是意味着没有声明编码的“字节顺序标记”,因此它不应该对 UTF8 文件有任何问题。在 Windows PowerShell 5.1 中,您可能需要按原样指定。

    看起来这对你来说是一个学习练习,如果有帮助,请告诉我。

    【讨论】:

    • 感谢您的帮助,但是代码对我不起作用。我尝试了两种迭代,但它们似乎都不起作用。第一个返回语法错误,声称-Filter 部分代码存在问题。第二个似乎无法识别搜索过滤器。尽管如此,为了回答提出的观点之一——我出于特定原因使用了-like-encoding。使用-like 是因为名字不完整,有些缺少第二个名字或第二个姓氏。使用 -Encoding 是因为在我的国家,我们使用 Č Š 和 Ž 字母,默认情况下不包含在内。
    • 另外 - 我一直在想如果使用 displayName 作为过滤器可能更容易?特别是因为默认情况下文件中的所有名称也是 displayNames。唯一的问题是我不知道Get-ADUser 是如何解释姓名和姓氏之间的空格的。
    • 已编辑答案。第一个示例缺少单引号,我修复了它。尽管您可能仍需要添加通配符,但请记下这一点。由于-eq 运算符,第二个代码示例可能无法返回。我使用-like 提供了与问题类似的第三个示例。所有3 个示例都在我的环境中使用您描述的文件格式的最佳假设进行了测试。如果-Encoding 有效,那就去吧!我做了一些澄清,版本细节等......我没有做很多国际化,但我的经验 Get-Content 非常擅长搞清楚。
    • 太棒了!谢谢,这行得通!感谢您对引号使用的澄清,我已经查看了它,并且将来会更多,因为我发现 microsoft docs 是一个非常有价值的信息来源。
    猜你喜欢
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多