使用过滤器时,是否可以捕获Get-ADUser中没有结果的输入对象?

时间:2019-07-16 21:46:39

标签: powershell

我有一个可能的帐户ID的列表。我想使用Get-ADUser来查询环境中是否存在该帐户或其变体。然后,我想捕获数据,包括原始列表中哪些帐户ID在环境中没有任何帐户。

我已经成功捕获了AD环境中具有帐户或帐户ID变体的帐户ID的数据。我很难用Get-ADUser从原始列表中捕获不会产生任何结果的帐户ID。

foreach ($user in $inputdata)
{$user = $user + "*"
$(try {Get-ADUser -filter {SamAccountName -like "$user"} -properties Description} catch {$null}) | % {if ($_ -ne $null) {[pscustomobject]@{"ID"=$_.SamAccountName;"DN"=$_.DistinguishedName;"Desc"=$_.Description}}
else {$noaccount += $user}
}

我的pscustomobject会使用来自拥有帐户的每个人的数据正确填充。但是,即使我的列表中的ID在环境中没有帐户,$ noaccount中也没有值。如何使用Get-ADUser捕获没有帐户的实例? 另外,不会输出错误。

1 个答案:

答案 0 :(得分:1)

以下内容将实现您想要的。

$noaccount = [Collections.Generic.List[String]] @()
foreach ($user in $inputdata) {
    $userToCheck = Get-ADUser -Filter "SamAccountName -like '$user*'" -properties Description
    if ($userToCheck) {
        [pscustomobject]@{"ID"=$userToCheck.SamAccountName
                          "DN"=$userToCheck.DistinguishedName
                          "Desc"=$userToCheck.Description
        }
    }
    else {
        $noaccount.Add($user)
    }
}

说明:

$noaccount被初始化为通用的字符串列表,以便我们可以使用.Add()方法而不是效率不高的+=运算符。 $userToCheck将包含找到的用户对象或$null,具体取决于查询是否找到了结果。如果找到用户,则if条件为$true,并输出您的自定义对象。如果未找到用户,则会触发else条件,并将存储在$user中的数据添加到$noaccount集合中。

我稍微更改了-Filter以删除脚本块表示法,因为它不是脚本块。该命令的在线文档通过演示脚本块符号的使用来教导不良习惯。取而代之的是,过滤器应该用双引号括起来,内部的值用单引号括起来。双引号将允许PowerShell插值在其中扩展变量。单引号将按字面传递,以便Get-ADUser将值解释为字符串。

通过您的尝试,try {}块很少会引发错误,也不会因为找不到帐户而引发错误。如果找不到对象,则必须删除-Filter来使用-Identity参数,以产生错误。但是,如果会话和域服务器之间存在连接问题,您仍然会看到错误。当您的Get-ADUser命令未产生任何输出时,将不会有任何内容通过管道传递到foreach {}脚本块中。因此,您的if {} else {}将永远不会得到评估。

增强注意事项:

根据Lee_Dailey提供的一些见解,您可以将未合并的帐户合并到自定义对象输出中,而不是将未找到的帐户添加到单独的集合中。也许您可以添加一个新属性,说明是否找到了它们。参见以下示例:

$noaccount = [Collections.Generic.List[String]] @()
foreach ($user in $inputdata) {
    $userToCheck = Get-ADUser -Filter "SamAccountName -like '$user*'" -properties Description
    if ($userToCheck) {
        [pscustomobject]@{"User" = $user
                          "ID"=$userToCheck.SamAccountName
                          "DN"=$userToCheck.DistinguishedName
                          "Desc"=$userToCheck.Description
                          "In_AD" = "Yes"
        }
    }
    else {
        [pscustomobject]@{"User" = $user
                          "ID"=$null
                          "DN"=$null
                          "Desc"=$null
                          "In_AD" = "No"
         }
    }
}