Можно ли перечислить все методы и свойства, доступные через Invoke() объекта [ADSI]?

Мне любопытно, может ли кто-нибудь описать, как перечислить методы ADSI, доступные через связанный экземпляр, как [ADSI]$instance.psbase.Invoke()?

Исследования выявили "см. документацию по интерфейсу ADSI". но я не особенно доволен этим ответом.

Если я создам экземпляр с помощью:

[ADSI]$lhost_group="WinNT://./Administrators,group"

Затем попытайтесь:

@($lhost_group.psbase.Invoke("Members")) | foreach-object {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}

Powershell вернет out из GetProperty("Name") для каждого объекта, содержащегося в группе.

Как мне перечислить все доступные методы и свойства, которые будут доступны через любой заданный интерфейс ADSI?

Этот ответ от Шей Леви является еще одним примером синтаксиса, в котором используются [ADSI]$_.GetTypes().InvokeMember() и [ADSI]$_.psbase.Invoke().


person mbrownnyc    schedule 30.08.2013    source источник
comment
Я хотел бы добавить свою награду к этому вопросу, но я не знаю, как?   -  person Loïc MICHEL    schedule 10.09.2013
comment
Я не думаю, что вы можете добавить дополнительную награду. Посоветуйтесь с ребятами в самой населенной комнате в чате (на верхней панели инструментов).   -  person mbrownnyc    schedule 10.09.2013
comment
хорошо, я прочитал документ ^^, должен дождаться окончания щедрости, прежде чем начинать новую ... очень плохо   -  person Loïc MICHEL    schedule 10.09.2013
comment
Спасибо C.B. Очень интересно!   -  person mbrownnyc    schedule 11.09.2013


Ответы (2)


Ответ «нет» и вряд ли изменится. Я разделяю ваше недовольство этим ответом, но я могу предоставить некоторую техническую информацию, чтобы поддержать и объяснить его.

Основная проблема заключается в том, что объекты ADSI с собственным кодом должны реализовывать COM-интерфейс IDispatch [который позволяет вызывать методы с поздней привязкой], но они не обязательно реализуют ITypeInfo [который допускает поведение, подобное отражению]. В PowerShell COM-объект, который реализует IDispatch, но не ITypeInfo, приводит к нечетному набору ограничений, что вы и заметили.

Провайдеру WinNT ADSI не менее 15 лет, и он никогда не был сильной стороной. Это был заполнитель, написанный до выпуска Active Directory (задолго до CLR или PowerShell). В то время «скриптинг» в Microsoft означал ранние версии VBScript с некоторой поддержкой JScript, оба из которых на IDispatch и никогда не использовал ITypeInfo.

Это было предметом обсуждения в начале жизни PowerShell, когда один из членов команды PowerShell сказал:

14 июля 2006 г.

... PowerShell не может отображать методы COM-объектов, если не предоставлен интерфейс ITypeInfo. Это будет исправлено в ближайшее время. Обходной путь — использовать Type.InvokeMethod().

В PowerShell были внесены улучшения в поддержку COM-объектов, но полное исправление так и не было реализовано. Я думаю, что член команды, возможно, переобещал то, что технически возможно. Это могло ввести людей в заблуждение. Пару лет назад я спросил об этом своего ведущего друга-разработчика в команде; он был явно знаком с проблемой и указал, что вариант использования не имеет высокого приоритета, а также упомянул обходной путь.

Команда PowerShell выпускает впечатляющие функции и исправления некоторых ошибок, но, честно говоря, я не думаю, что эта проблема когда-либо появится на панели ошибок.

person Burt_Harris    schedule 15.07.2014
comment
Спасибо Вам за информацию. Я действительно думаю, что это оставляет дыру, но тяжелая работа для достижения той же цели уже присутствует в работе других. Однако было бы неплохо, если бы MSFT приложила немного усилий, чтобы вычеркнуть это из списка. Одно из замечательных выступлений на TechEd было в основном посвящено изучению PowerShell через его изучение; это кирпичная стена, с которой я столкнулся в первые две недели погружения. - person mbrownnyc; 17.07.2014
comment
Я понимаю, но лично я думаю, что было бы намного приятнее (и более реалистично), если бы Microsoft опубликовала полный набор командлетов для управления локальными учетными записями, а не пороли лошадь поставщика ADSI/WinNT. Командлеты всегда более доступны для обнаружения, чем методы для объектов, для людей, которые суетятся, имеют устоявшиеся соглашения об именах, файлы справки и т. д. - person Burt_Harris; 17.07.2014

Не совсем уверен, что это отвечает на ваш вопрос, но как насчет следующего?

$lhost_group.getType().DeclaredMembers | where { $_.MemberType -eq "Method" -or $_.MemberType -eq "Property" }

person The Unique Paul Smith    schedule 10.09.2013
comment
$lhost_group.getType().DeclaredMembers | measure. Результат Count: 0. Вам повезло с вашей локальной системой? - person mbrownnyc; 11.09.2013
comment
Да, это работало в PoSH v3, но не в v1/2. Попробуйте $lhost_group.getType().GetProperties() и $lhost_group.getType().GetMethods(). Это та информация, которую вы ищете? - person The Unique Paul Smith; 11.09.2013
comment
Нет, я ищу методы и свойства, предоставляемые интерфейсом ADSI, а не методы и свойства, предоставляемые System.DirectoryServices.DirectoryEntry. Вот что делает это таким веселым. :) - person mbrownnyc; 11.09.2013