2013-08-30 12 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

ok私は文書を読んだ^^、新しいものを始める前に賞金の終わりを待たなければならない...あまりにも悪い –

答えて

5

答えが「いいえ」であり、変更することはほとんどありません。私はその答えにあなたの不幸を分かち合いますが、私はそれをサポートし、説明するための技術的背景を提供することができます。

コアの問題は、ネイティブコードのADSIオブジェクトがCOMインターフェイスIDispatch(遅延バインドされたメソッドを呼び出すことができる)を実装する必要がありますが、必ずしも反射的な動作を可能にするITypeInfoを実装するとは限りません。 PowerShellでは、IDispatchを実装していて、ITypeInfoを実装していないCOMオブジェクトは、奇妙な制限があります。これは気づいています。

WinNT ADSIプロバイダーは少なくとも15歳で、強力な機能はありません。その前にと書かれていた Active Directoryが出荷された(CLRまたはPowerShellの前に)Microsoftでは、「スクリプティング」とはVBScriptの初期バージョンを意味し、JScriptをサポートしていて、どちらもIDispatchに依存し、 ITypeInfo。 PowerShellのチームメンバーの1が言ったとき

これは、早期のPowerShellの生活の中で議論の話題だった:

2006年7月14日は

... PowerShellはCOMのメソッドを表示することはできませんITypeInfo インターフェイスが提供されていない場合のオブジェクトこれは間もなく修正される予定です。この問題を回避するには、 Type.InvokeMethod()を使用します。

PowerShellのCOMオブジェクトのサポートが改善されましたが、完全な修正が実現されていません。私はチームメンバーが技術的に可能なことを過度に約束しているかもしれないと思う。これは人々を混乱させるかもしれません。私は数年前にこのことについてチームの友人の友人に尋ねました。彼は明らかにこの問題に精通しており、ユースケースは優先順位が高くなく、回避策についても言及していました。

PowerShellチームは印象的な機能といくつかのバグフィックスを出荷していますが、この問題がバグを修正するとは思えません。

+0

情報ありがとうございました。私は本当にそれが穴を残すと思うが、同じ目標を達成するための重い持ち上げはすでに他人の仕事のまわりにある。しかし、MSFTにとってこれをリストから取り除く努力を少ししてもいいだろう。 TechEdの大きな話のひとつは、基本的にPowerShellを叩いて学習することでした。これは私のダイビングの最初の2週間以内にヒットしたレンガの壁です。 – mbrownnyc

+1

私は理解しますが、個人的には、MicrosoftがADSI/WinNTプロバイダーの馬をぶち壊すのではなく、ローカルアカウント操作コマンドレットの完全なセットを公開する方がはるかに良い(より現実的)と思っています。コマンドレットは、オブジェクト上のメソッドよりも常に発見可能であり、人々は慣れるために、命名規則、ヘルプファイルなどを確立しています。 –

2

これがあなたの質問に答えるかどうかは確かではありませんが、以下はどうですか?

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

+0

'$ lhost_group.getType()。DeclaredMembers |測定する。結果は「Count:0」になります。あなたのローカルシステムに運がありましたか? – mbrownnyc

+0

それはPoSH v3では動作しましたが、v1/2では動作しませんでした。 '$ lhost_group.getType()。GetProperties()'と '$ lhost_group.getType()。GetMethods()'を試してください。それはあなたの探している情報ですか? –

+0

いいえ、私は、メソッドとプロパティが 'System.DirectoryServices.DirectoryEntry'によって公開されているのではなく、ADSIインターフェイスによって公開されているメソッドとプロパティを探しています。それがこれをとても楽しくするものです。 :) – mbrownnyc

関連する問題