10

我很好奇是否有人可以描述如何通过绑定实例枚举可用的 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 将为组中包含的每个对象返回outof GetProperty("Name")

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

来自 Shay Levy 的这个答案[ADSI]$_.GetTypes().InvokeMember()是使用和使用语法的另一个示例[ADSI]$_.psbase.Invoke()

4

2 回答 2

7

答案是“不”,而且不太可能改变。我和你一样对这个答案不满意,但我可以提供一些技术背景来支持和解释它。

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

WinNT ADSI 提供程序至少有 15 年的历史,而且它从来都不是一个强大的功能。它是在Active Directory 发布之前(在 CLR 或 PowerShell 之前)编写的占位符。当时,微软的“脚本”意味着早期版本的 VBScript,并支持 JScript,两者都依赖于 IDispatch 并且从未使用过 ITypeInfo。

这是 PowerShell 早期讨论的一个话题,当时 PowerShell 团队的一位成员说:

2006 年 7 月 14 日

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

PowerShell 对 COM 对象的支持有所改进,但从未实现完整的修复。我认为团队成员可能过度承诺了技术上可能的事情。这可能让人们感到困惑。几年前,我向团队中的一位开发主管朋友询问了这个问题;他显然很熟悉这个问题,并表示用例不是高优先级,并提到了解决方法。

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

于 2014-07-15T22:33:24.237 回答
2

不完全确定这是否回答了您的问题,但是以下内容呢?

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

于 2013-09-10T18:53:51.500 回答