我很好奇是否有人可以描述如何通过绑定实例枚举可用的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接口可用的所有可用方法和属性?
This answer from Shay Levy是另一个使用[ADSI]$_.GetTypes().InvokeMember()
和[ADSI]$_.psbase.Invoke()
的语法示例。
答案 0 :(得分:6)
答案是'否'它不太可能改变。我与你的答案分享你的不满,但我可以提供一些技术背景来支持和解释它。
核心问题是本机代码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团队已经发布了令人印象深刻的功能和一些错误修复,但坦率地说,我不认为这个问题会导致错误。
答案 1 :(得分:2)
不确定这是否能回答您的问题,但以下内容如何?
$lhost_group.getType().DeclaredMembers | where { $_.MemberType -eq "Method" -or $_.MemberType -eq "Property" }