输入.txt文件并查找Active Directory并输出到.CSV

时间:2018-11-27 13:36:13

标签: powershell active-directory

我有一个名称列表,我需要为此输入AD用户名,该列表的格式与AD中的显示名称相同。

我运行了以下代码

Get-Content c:\test\users.txt | 
    Foreach-Object {Get-ADUser -filter "displayName -like '$($_)'" |
    Select-Object SamAccountName,name} |
    Export-Csv c:\test\output1.csv

这会输出一个用户名和名称列表,但是只会输出成功的名称解析。

我想做的是能够列出要验证的名称。这可能由于两个原因而返回错误:

  1. 名字不正确
  2. 用户已离开组织。

例如 input.txt将是显示名称格式的名称列表。

我想要的输出:

Original Input        Exists in AD        Username
Name 1                True                Username1
Name 2                True                Username2 
etc.                  False               Check 

在此先感谢

3 个答案:

答案 0 :(得分:1)

您可以在管道中创建一个自定义对象。另外,使用LDAP过滤器anr(歧义名称解析)可能更适合名称列表,因为它会查找用户的多个属性以查找匹配项。

解决方案可能是这样的:

Get-Content "C:\test\users.txt" |
Foreach-Object {$user=get-aduser -ldapfilter "(anr=$_)"; `
[PSCustomObject]@{Name=$_; Username=$user.samaccountname; Exists=&{$user -ne $null}}} |
Export-Csv "c:\test\output1.csv"

答案 1 :(得分:0)

您必须测试是否从Get-ADUser返回了某些内容,如果什么都没做,请执行其他操作。

我认为这应该可以满足您的需求,但是您可能需要对其进行调整:

Get-Content c:\test\users.txt | Foreach-Object {
    $user = Get-ADUser -filter "displayName -like '$($_)'" -Properties DisplayName,SamAccountName,Name
    if ($user) {
        $user | Select-Object DisplayName,SamAccountName,Name
    } else {
        $_ | Select-Object @{Label="DisplayName";Expression={"$_"}},@{Label="SamAccountName";Expression={""}},@{Label="Name";Expression={""}}
    }
} |export-csv c:\test\output1.csv

如果未找到任何内容,则只会输出文件中的显示名称。 Label=Expression=表示法的全部目的是确保其输出的属性与找到​​ 时输出的属性相同,因此可以将列表全部放在一起。

答案 2 :(得分:0)

使用Join-Object cmdlet中的PowerShell Gallery

Get-Content .\Users.txt | ForEach {[PSCustomObject]@{Name=$_; InList=$True}} |
FullJoin (Import-Csv .\output1.csv) Name

将输出类似:

Name  InList SamAccountName
----  ------ --------------
name1   True Sam1
name2   True
name5   True Sam5
Name3        Sam3