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

mbr*_*nyc 9 reflection syntax powershell system.reflection

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

研究已经出现"参考ADSI接口的文档".但我对这个答案并不是特别满意.

如果我实例化:

[ADSI]$lhost_group="WinNT://./Administrators,group"
Run Code Online (Sandbox Code Playgroud)

然后尝试:

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

Powershell将返回组中包含的每个对象的outof GetProperty("Name").

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

这从吉文·利维答案就是语法的另一个例子[ADSI]$_.GetTypes().InvokeMember()[ADSI]$_.psbase.Invoke()使用.

Bur*_*ris 7

答案是"不",不太可能改变.我与你的答案分享你的不满,但我可以提供一些技术背景来支持和解释它.

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

WinNT ADSI提供商至少已有15年的历史,并且从未有过强大的功能.它是 Active Directory发布之前编写的占位符(在CLR或PowerShell之前的方式.)那时,Microsoft的'脚本'意味着VBScript的早期版本,并且支持JScript,这两个版本都依赖于IDispatch并且从未使用过ITypeInfo.

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

2006年7月14日

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

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

PowerShell团队已经发布了令人印象深刻的功能和一些错误修复,但坦率地说,我不认为这个问题会导致错误.