是否可以枚举通过[ADSI]对象的Invoke()使用的所有方法和属性?

问题描述 投票:9回答:2

我很好奇是否有人可以描述如何枚举通过绑定实例可用的ADSI方法为[ADSI]$instance.psbase.Invoke()

研究已提出"refer to the docs for the ADSI interface"。但是我对这个答案并不特别满意。

如果实例化为:

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

然后尝试:

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

Powershell将为组中包含的每个对象返回outGetProperty("Name")

如何枚举可通过任何给定的ADSI接口使用的所有可用方法和属性?

[This answer from Shay Levy是使用[ADSI]$_.GetTypes().InvokeMember()[ADSI]$_.psbase.Invoke()的语法的另一个示例。

powershell reflection syntax system.reflection
2个回答
7
投票

答案为“否”,不可能改变。我对此表示满意,但我可以提供一些技术背景来支持和解释它。

核心问题是,本机代码ADSI对象必须实现COM接口IDispatch [允许调用后期绑定的方法],但不一定实现ITypeInfo [允许类似反射的行为]。在PowerShell中,实现IDispatch但未实现ITypeInfo的COM对象会导致一组奇怪的限制,这正是您要注意的。

WinNT ADSI提供程序至少有15年的历史,它从来都不是一个强大的功能。这是一个在Active Directory中(在CLR或PowerShell之前)编写的占位符,写入了[[before Active Directory。那时,Microsoft的“脚本”意味着VBScript的早期版本,并且对JScript有所支持,这两个都依赖于IDispatch和从未使用过ITypeInfo。

这是PowerShell生命早期的讨论主题,当PowerShell团队的一位成员说:

2006年7月14日

...如果ITypeInfo,PowerShell无法显示COM对象的方法没有提供接口。这将很快修复。解决方法是使用Type.InvokeMethod()。

PowerShell对COM对象的支持有所改进,但从未实现过完整的修复。我认为该团队成员可能对技术上可行的承诺过高。这可能使人们感到困惑。几年前,我问过我的开发人员团队的主要朋友。他显然很熟悉这个问题,并指出用例不是一个高优先级,并且也提到了解决方法。

PowerShell团队一直在提供令人印象深刻的功能和一些错误修复,但是坦率地说,我认为这个问题永远不会成为错误的解决之道。


2
投票
不确定是否能回答您的问题,但是接下来呢?

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

© www.soinside.com 2019 - 2024. All rights reserved.