Get-ADOrganizationalUnit returns 空白值

Get-ADOrganizationalUnit returns blank value

只是查找嵌套在其他 OU 中的 OU 的计数。我正在使用 'OneLevel' 作用域,它应该给我直接在父项下的任何 OU 对象,而不是父项本身。

示例(拉取整个子树,包括父树):

PS C:\> $OUCountSubtree = Get-ADOrganizationalUnit -Filter * -SearchScope Subtree -SearchBase 'OU=MyParentOU,DC=USA,DC=hello,DC=there'
PS C:\> $OUCountSubtree.Name
PS C:\> MySubOU
PS C:\> MyParentOU
PS C:\> $OUCountSubtree.Count
PS C:\> 2

所以效果很好。但是,当我尝试 return 已发现对象的计数时,或者我尝试对结果数字进行任何整数运算时,如果计数为 1,它就会出错。当它为 0 或 2+ 时,它会起作用。此外,当我显示完整结果(而不仅仅是计数)时,一切看起来都很好。

示例(仅拉取子 OU):

PS C:\> $OUCountOneLevel = Get-ADOrganizationalUnit -Filter * -SearchScope OneLevel -SearchBase 'OU=MyParentOU,DC=USA,DC=hello,DC=there'
PS C:\> $OUCountOneLevel.Name
PS C:\> MySubOU
PS C:\> $OUCountOneLevel.Count
PS C:\>

完整性检查

PS C:\> $OUCountOneLevel

City                     :
Count                    : {}
Country                  :
DistinguishedName        : OU=MySubOU,OU=MyParentOU,DC=USA,DC=hello,DC=there
LinkedGroupPolicyObjects : {}
ManagedBy                :
Name                     : MySubOU
ObjectClass              : organizationalUnit
ObjectGUID               : [some guid]
PostalCode               :
State                    :
StreetAddress            :

因此只有一个 OU returned。然而...

PS C:\> $OUCountOneLevel.Count -eq 0
PS C:\> False
PS C:\> $OUCountOneLevel.Count -eq $null
PS C:\> False
PS C:\> $OUCountOneLevel.Count -eq ''
PS C:\> False
PS C:\> 5 + $OUCountOneLevel.Count
PS C:\> Method invocation failed because [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] does not contain a method named 'op_Addition'.

多年来我一直在做这种事情,但我不记得以前见过这种行为。为什么这不是 return 整数 1?除了对 AD 的简单查询之外,我还没有声明数组或任何内容。

TheIncorrigible1 在评论中有正确的想法。

如果有多个结果,许多 AD cmdlet return 一个数组,但如果只有一个,return 对象本身。如果你想始终如一地获得一个数组,那么你可以使用 @(...):

强制它
$OUCountSubtree = @(Get-ADOrganizationalUnit -Filter * -SearchScope Subtree -SearchBase 'OU=MyParentOU,DC=USA,DC=hello,DC=there')

在此处阅读有关 "array sub-expression operator" 的更多信息:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_arrays?view=powershell-6#the-array-sub-expression-operator

备选答案:使用 Powershell Cmdlet 而不是对象的属性。

Powershell 包含 Measure-Object Cmdlet,当您不知道结果可以是 $null、数组还是单个对象时,它非常有用。在消极的部分 - 它的 Powershell - 所以它将是更长的代码行。就资源而言可能也更昂贵。

$OUCountOneLevel | Measure-Object | Select-Object -ExpandProperty Count

但是这个"problem"并不局限于AD Cmdlets,它在所有操作中都是继承的。如果管道中最后一个元素的结果为无对象,则结果为 $null。如果它是一个单一的对象,它将是一个单一的对象。如果是多个对象,就是一个数组。

但是 - 当您尝试向您认为是列表的内容添加内容时,也会发生这种情况。鉴于有多个名为 johndoe 的用户,以下工作正常:

$users = Get-ADUser -Filter 'name -like "johndoe"'
$users += $someotherobject

但是如果它是单个用户 - 您必须以某种方式强制使用数组。我这样做,结果可能与 Gabriel Luci 的回答相同。

$users = @()
$users += Get-ADUser -Filter 'name -like "johndoe"'
$users += $someotherobject