2013-08-30 44 views
9

我很好奇,如果有人可以描述如何枚舉通過綁定實例可用的ADSI方法,如[ADSI]$instance.psbase.Invoke()是否可以通過[ADSI]對象的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()的語法的另一個例子。

+0

我想添加我自己的賞金這個問題,但我不知道如何? –

+0

我不認爲你可以添加額外的賞金。與聊天室中人口最稠密的房間(頂部工具欄)檢查。 – mbrownnyc

+0

確定我已閱讀文檔^^,在開始新文章之前必須等待賞金結束......太糟糕了 –

回答

5

答案是「不」,這是不可能改變的。我與你的答案分享你的不滿,但我可以提供一些技術背景來支持和解釋它。

核心問題是本機代碼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 接口沒有提供。這將很快得到解決。解決方法是使用 Type.InvokeMethod()。

PowerShell對COM對象的支持已有所改進,但從未實現完整的修復。我認爲這個團隊成員可能已經過分承諾技術上可行的。這可能讓人感到困惑。幾年前,我向團隊的一位開發人員主要朋友詢問了這件事情;他對這個問題非常熟悉,並表示該用例不是高優先級,並提到了解決方法。

PowerShell團隊一直在發送令人印象深刻的功能和一些錯誤修復,但坦率地說,我不認爲這個問題會成爲bug欄。

+0

謝謝你的信息。我真的認爲它留下了一個漏洞,但爲了達到同樣的目標而舉重也已經在其他人的工作中。對於MSFT來說,儘管將這一點從名單上刪除,這將是件好事。 TechEd的一次重要講座主要是通過對PowerShell的研究來了解PowerShell;這是我在我潛水的前兩週內遇到的磚牆。 – mbrownnyc

+1

我明白,但是我個人認爲讓微軟發佈一套完整的本地帳戶操作Cmdlet而不是抨擊ADSI/WinNT提供商馬會更好(更現實)。 Cmdlet總是比對象上的方法更容易發現,對於人們來說,有很好的命名約定,幫助文件等等。 –

2

不完全確定這是否回答您的問題,但以下情況如何?

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

+0

'$ lhost_group.getType()。DeclaredMembers | measure'。 「Count:0」結果。你有沒有在你的本地系統上運氣? – mbrownnyc

+0

是的,它在PoSH v3中工作,但不是v1/2。試試'$ lhost_group.getType()。GetProperties()'和'$ lhost_group.getType()。GetMethods()'。這是你要找的信息嗎? –

+0

不,我正在尋找ADSI接口公開的方法和屬性,而不是'System.DirectoryServices.DirectoryEntry'公開的方法和屬性。這是什麼讓這非常有趣。 :) – mbrownnyc

相關問題