【问题标题】:Is it possible to enumerate all methods and properties that are available via Invoke() of an [ADSI] object?是否可以枚举通过 [ADSI] 对象的 Invoke() 可用的所有方法和属性?
【发布时间】:2013-08-30 17:55:44
【问题描述】:

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

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

This answer from Shay Levy 是另一个使用[ADSI]$_.GetTypes().InvokeMember()[ADSI]$_.psbase.Invoke() 的语法示例。

【问题讨论】:

  • 我想为这个问题添加我自己的赏金,但我不知道怎么做?
  • 我不认为你可以增加额外的赏金。与聊天中人口最多的房间里的人核对一下(在顶部工具栏上)。
  • 好的,我已经阅读了文档^^,必须等待赏金结束才能开始新的......太糟糕了
  • 感谢 C.B. 非常有趣!

标签: powershell reflection syntax system.reflection


【解决方案1】:

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

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

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

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

2006 年 7 月 14 日

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

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

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

【讨论】:

  • 感谢您提供的信息。我真的认为它留下了一个漏洞,但实现相同目标的繁重工作已经存在于其他人的工作中。不过,对于 MSFT 来说,稍微努力将其从列表中删除会很好。 TechEd 的一场精彩演讲基本上是关于通过在其中学习 PowerShell 的。这是我潜水前两周碰到的一堵砖墙。
  • 我理解,但我个人认为让 Microsoft 发布一套完整的本地帐户操作 Cmdlet 而不是鞭打 ADSI/WinNT 提供程序马会更好(也更现实)。 Cmdlet 总是比对象上的方法更容易被发现,因为人们到处乱搞,有完善的命名约定、帮助文件等。
【解决方案2】:

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

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

【讨论】:

  • $lhost_group.getType().DeclaredMembers | measure。结果为Count: 0。你的本地系统有什么运气吗?
  • 是的,它在 PoSH v3 中有效,但在 v1/2 中无效。试试$lhost_group.getType().GetProperties()$lhost_group.getType().GetMethods()。这是您要查找的信息吗?
  • 不,我要查找的是 ADSI 接口公开的方法和属性,而不是 System.DirectoryServices.DirectoryEntry 公开的方法和属性。这就是让这一切变得如此有趣的原因。 :)
猜你喜欢
  • 2012-02-13
  • 2011-12-22
  • 1970-01-01
  • 2017-12-18
  • 2018-12-18
  • 2011-11-16
相关资源
最近更新 更多