Get-ADOrganizationalUnit возвращает пустое значение - PullRequest
0 голосов
/ 23 мая 2018

Просто ищем количество 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.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Альтернативный ответ: используйте командлеты Powershell, а не свойства объектов.

Powershell включает в себя командлет Measure-Object, который отлично подходит, если вы не знаете, может ли результат быть $null, массивом или отдельным объектом.,С отрицательной стороны - его Powershell - так что это будет более длинные строки кода.Вероятно, и дороже с точки зрения ресурсов.

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

Эта «проблема», однако, не ограничивается командлетами AD, она наследуется во всех операциях.Если результат последнего элемента в конвейере не содержит объектов, результат равен $null.Если это один объект, это будет один объект.Если это несколько объектов, это будет массив.

Однако - это также происходит, когда вы пытаетесь добавить что-то к тому, что вы считаете списком.Следующее прекрасно работает, учитывая, что существует более одного пользователя с именем johndoe:

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

Но если это один пользователь - вы должны как-то форсировать массив.Я делаю это, что, вероятно, приводит к тому же, что и ответ Габриэля Люси.

$users = @()
$users += Get-ADUser -Filter 'name -like "johndoe"'
$users += $someotherobject
0 голосов
/ 24 мая 2018

TheIncorrigible1 имеет правильную идею в комментариях.

Многие из командлетов AD возвращают массив, если имеется более одного результата, но возвращают сам объект, если есть только один.Если вы хотите постоянно получать массив, вы можете принудительно его использовать, используя @(...):

$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

...