作为一种测试和从AD中获取特定数据的方法,我试图基于包含用户名和姓氏的txt文件获取数据。我了解到,使用ConvertFrom-String
cmdlet可以将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
任何帮助将不胜感激。
您正在非扩展字符串中使用子表达式。请查看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
参数采用字符串,因此可以接受,并且使其更易于阅读。
另请注意:您可能需要“ *”才能使其正常工作。从技术上讲,like可以在完全匹配上工作,但是在使用通配符搜索时更常用。就您而言,使用'*$($_.P1)*'
可能有助于您解决问题。
如果您对这些值充满信心,尤其是考虑到您还使用-and
运算符,则可以考虑使用-eq
。但是,我会担心,因为经常会有通用名称冲突的可能性。例如在美国,很容易在AD中有2位John Smiths ...
我还要指出,为此使用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中,您可能需要指定。
看来这是您的学习练习,如果有帮助,请告诉我。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句