我很好奇是否有人可以描述如何通过绑定实例枚举可用的 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 将返回out
of GetProperty("Name")
对于组中包含的每个对象。
如何枚举通过任何给定 ADSI 接口可用的所有可用方法和属性?
谢伊·利维的回答是另一个语法示例,其中[ADSI]$_.GetTypes().InvokeMember()
and [ADSI]$_.psbase.Invoke()
被使用。
答案是否定的,并且不太可能改变。我和你一样对这个答案感到不满,但我可以提供一些技术背景来支持和解释它。
核心问题是本机代码 ADSI 对象必须实现 COM 接口 IDispatch [它允许调用后期绑定方法],但它们不一定实现 ITypeInfo [它允许类似反射的行为]。在 PowerShell 中,实现 IDispatch 但不实现 ITypeInfo 的 COM 对象会导致一组奇怪的限制,这就是您所注意到的。
WinNT ADSI 提供程序至少已有 15 年历史,而且它从来都不是一个强大的功能。这是一个占位符写的beforeActive Directory 发布(远远早于 CLR 或 PowerShell)。当时,Microsoft 的“脚本”意味着 VBScript 的早期版本,并对 JScript 提供一定支持,这两者都依赖于 IDispatch 并且从未使用过 ITypeInfo。
这是 PowerShell 早期讨论的一个话题,当时一位 PowerShell 团队成员说:
2006 年 7 月 14 日
...如果 ITypeInfo 存在,则 PowerShell 无法显示 COM 对象的方法
未提供接口。这个问题很快就会得到解决。解决方法是使用
类型.InvokeMethod()。
PowerShell 对 COM 对象的支持有所改进,但完整的修复从未实现。我认为团队成员可能过度承诺了技术上可行的事情。这可能会让人们感到困惑。几年前,我向团队中的一位开发主管朋友询问了这个问题;他显然熟悉这个问题,并表示该用例不是高优先级,并提到了解决方法。
PowerShell 团队一直在提供令人印象深刻的功能和一些错误修复,但坦率地说,我认为这个问题永远不会成为错误栏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)