Get-QADUser -IncludeAllProperties

Очень часто задают подобные вопросы про Get-QAD* командлеты:

При тестировании всё нормально:
$user  = Get-QADUser Иванов
$user.proxyAddresses
smtp:ivanov@domain.ru
smtp:ii@domain.ru
Но если поместить в цикл, то оно не отрабатывает😦 Такое ощущение будто бы у объектов отсутствует это свойство.
Пример:
ForEach ($user in Get-QADUser -SearchRoot ‘domain/OU’)
{
    Write-host «Name:» $user.Name
    Write-Host «Email Address:» $user.proxyAddresses
    Write-Host «————-«
}
В чем может быть проблема? Можете что то посоветовать?

Это by design😉 Короче говоря так задумано. И сейчас объясню зачем, и как решить эту проблему.

Дело в том что большинство объектов в Active Directory (особенно пользователи и компьютеры), обладают огромным количеством свойств, а внутри этих свойств содержатся данные. Таким образом, если бы командлеты возвращали объекты из AD целиком, то простейшая команда $objects = Get-QADObject привела бы к тому что командлет попытался бы запихнуть в $objects всё содержимое Active Directory. А так как переменные PowerShell не оптимизированы под хранение таких данных в памяти😉 — память скорее всего кончилась бы🙂

Поэтому, разработчики AD Comandlet’ов решили сделать чтобы при запросе одного объекта запрашивались все его свойства, а при запросе нескольких — лишь узкий набор свойств, вроде DN, Name или EMail. Все остальные свойства в такой ситуации по умолчанию возвращаются пустыми.

Ключевое слово — «по умолчанию». Если вам при выполнении команды необходимо запросить несколько объектов и нужны свойства не попадающие в стандартный краткий набор, их можно указать с помощью ключа -IncludedProperties. Например:

Get-QADUser -IncludedProperties Свойство1, Свойство2, Свойство3

То есть код из вопроса превращается в такой:

ForEach ($user in Get-QADUser -IncludedProperties proxyAddresses) 
{
	Write-host "Name:" $user.Name
	Write-Host "Email Address:" $user.proxyAddresses
	Write-Host "-------------"
}

Кроме того упомяну еще ключ -IncludeAllProperties который заставляет команду возвращать все атрибуты даже при запросе нескольких объектов. Ну и еще есть -ExcludedProperties, его назначение думаю всем понятно — он исключает указанные свойства из запрашиваемого набора.

Если же вас совсем не устраивает набор свойств выбранный разработчиками, или просто не хочется указывать часто необходимое свойство при каждом вызове командлетов, то можно воспользоваться командлетом Set-QADPSSnapinSettings с одним из следующих аргументов:

-DefaultExcludedProperties
-DefaultOutputPropertiesForAdObject
-DefaultOutputPropertiesForComputerObject
-DefaultOutputPropertiesForGroupObject
-DefaultOutputPropertiesForPasswordSettingsObject
-DefaultOutputPropertiesForUserObject

В качестве параметров, надо указать ваш список свойств. Например чтобы Get-QADUser возвращал только name и proxyAddresses надо выполнить следующую строку:

Set-QADPSSnapinSettings -DefaultOutputPropertiesForUserObject name, proxyAddresses
Опубликовано в Learn, PowerShell, Scripting, Tips. Комментарии к записи Get-QADUser -IncludeAllProperties отключены
%d такие блоггеры, как: