【问题标题】:Get-ADOrganizationalUnit returns blank valueGet-ADOrganizationalUnit 返回空白值
【发布时间】:2018-05-23 20:13:00
【问题描述】:

仅查找嵌套在其他 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

所以效果很好。但是,当我尝试返回已发现对象的计数,或者尝试对结果数字进行任何整数运算时,如果计数为 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。然而……

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'.

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

【问题讨论】:

  • 尝试强制数组:@(Get-...)

标签: powershell active-directory powershell-module


【解决方案1】:

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

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

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

然而,这个“问题”并不局限于 AD Cmdlet,它在所有操作中都是继承的。如果管道中最后一个元素的结果是没有对象,则结果是$null。如果它是单个对象,它将是单个对象。如果是多个对象,则为数组。

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

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

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

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

【讨论】:

  • 难道我不能通过在我希望成为带有 [array] 标识符的数组的任何变量的名称前面来避免这个问题吗?不确定如何处理 $null。
  • 如果你不知道的话,在 Powershell 中为变量添加类型实际上会做一些奇怪的事情:它锁定了该变量的数据类型。 [String[]]$MyObject 强制 $MyObject 始终为字符串数组。因此,即使您执行 $MyObject = 5,$MyObject 仍然是一个数组。可能会被使用/滥用。似乎它不适用于 $null 虽然 ([Object[]]$p = $null) 会导致 $p 未定义。
  • 关于我的评论的一些注释 - 左声明似乎没有将其锁定到数组,因为当设置为 $null 时它将为 $null。但是,除了 $null 之外的所有内容都将尝试转换回您声明的类型。使用 Get-Variable 探索变量名称以了解我的意思。
【解决方案2】:

TheIncorrigible1 在 cmets 中有正确的想法。

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

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

在此处阅读有关“数组子表达式运算符”的更多信息:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_arrays?view=powershell-6#the-array-sub-expression-operator

【讨论】:

    猜你喜欢
    • 2015-09-21
    • 2018-02-04
    • 1970-01-01
    • 2021-11-20
    • 2021-01-09
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多