我很好奇是否有人可以描述如何通过绑定(bind)实例将枚举的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将为组中包含的每个对象返回
out
的GetProperty("Name")
。如何枚举可通过任何给定ADSI接口(interface)使用的所有可用方法和属性?
This answer from Shay Levy是使用
[ADSI]$_.GetTypes().InvokeMember()
和[ADSI]$_.psbase.Invoke()
的语法的另一个示例。 最佳答案
答案是“否”,并且不可能改变。我对此表示满意,但我可以提供一些技术背景来支持和解释它。
核心问题是 native 代码ADSI对象必须实现COM接口(interface)IDispatch [允许调用后期绑定(bind)的方法],但是它们不一定实现ITypeInfo [允许类似反射的行为]。在PowerShell中,实现IDispatch而不实现ITypeInfo的COM对象会导致一组奇怪的限制,这正是您要注意的。
WinNT ADSI提供程序至少有15年的历史,它从来都不是一个强大的功能。它是在Active Directory交付之前(在CLR或PowerShell之前)编写的占位符。那时,Microsoft的“脚本”意味着VBScript的早期版本,并带有对JScript的某些支持,这两个都依靠IDispatch且从未使用过ITypeInfo。
在PowerShell生命早期,这是一个讨论话题,当时PowerShell团队的一位成员说:
PowerShell对COM对象的支持得到了改进,但是从未实现过完整的修复。我认为该团队成员可能对技术上的可能性做出了过高的 promise 。这可能使人们感到困惑。几年前,我问过我的开发人员团队的主要 friend 。他显然很熟悉这个问题,并指出用例不是一个高优先级,并且也提到了解决方法。
PowerShell团队一直在提供令人印象深刻的功能和一些错误修复,但是坦率地说,我认为这个问题永远不会成为错误的解决之道。
关于powershell - 是否可以枚举可通过[ADSI]对象的Invoke()使用的所有方法和属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18538840/