我有一个可能的帐户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捕获没有帐户的实例? 另外,不会输出错误。
答案 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"
}
}
}