2016-04-05 9 views
0

を返します。スクリプトは何は、私は私のC#コードでPowerShellスクリプトを統合していると私はC#を使用して、それを呼び出すRuntimeBinderException

は、それがいくつかのグループとActive Directoryのからそのメンバーを取得し、PSObjectとしての私のC#コードでそれらを返しています。このオブジェクトには、グループに含まれるメンバーのアレイを含む「Member」というプロパティがあります。これらのメンバーのそれぞれは、PowerShellを介して追加したEmailAddress、Nameなどのプロパティを持っています。また、スクリプトもテストしましたが、意図したとおりに動作します。ここで

は、私は動的変数を使用してグループのメンバーを取得しようとC#での私のコードです:

GetGroupMembers(PSObject groupObject) { 
    // These are the group members, an object Array with 4 objects gets returned 
    dynamic members = groupObject.Properties["Member"].Value; 

    foreach (var member in members) { 
     string objectClass = member.ObjectClass; 
     ADObject memberObject; 

     switch (objectClass) { 
      case "user": 
       // This is where the exception gets thrown, since the "EmailAddress" value is null 
       string email = member.Properties["EmailAddress"].Value.ToString(); 
      [...] 

ここでの問題はデバッグ中、私は実際に、動的にプロパティがあることをそこに見ることができるということですメンバー変数は、それは、foreachループ中部材変数で除去します。 Here's a screenshot I made during debugging, which shows clearly that the property is available in the members variable.

私はメッセージとRuntimeBinderExceptionで取得例外が(閉鎖、呼び出し場所、オブジェクト、String)を System.Dynamic.UpdateDelegates.UpdateAndExecute2でCallSite.Targetで 「null参照に実行時バインディングを実行できません」 [T0、T1、TRET](呼び出し場所サイト、T0のarg0に、T1 arg1の)

はたぶんエラーがクリアされているが、私は私が間違ってやっているかを把握するように見えることはできません。本当に助けに感謝します。ありがとうございました!

+0

あなたのスクリーンショットは、唯一のプロパティが存在することを示しています。私は、これは誰もが、まだ解決策を探しているなら、私はそれを解決する方法である、全くdynamicタイプを使用していませんでした。プロパティが実際にnull値でないという証拠はありません。正確な例外がどこで発生するのかを知るためにコマンドを分割する必要があります: 'PSPropertyInfo property = member.Properties [" EmailAddress "];オブジェクト値=プロパティ。値。文字列email = value.ToString(); '。 – PetSerAl

+0

@PetSerAl答えをありがとう。問題は、 'member.Properties [「のEmailAddress」]は'実際に 'null'なのである、とforeachループの前に私は(あなたがスクリーンショットに基づいて説明したように)プロパティが少なくとも存在することを確認することができ、そしてそれは奇妙なことだということです何らかの形でそれが失われる...私は、あなたから言及されたステートメントを追加するときRuntimeBinderExceptionを取得します: 'PSPropertyInfo property = member.Properties [" EmailAddress "]; '' – lleshiart

+0

文字列電子メール= member.EmailAddress、nullを返します ' – PetSerAl

答えて

0

私はこの問題を解決するために管理。

GetGroupMembers(PSObject groupObject) { 
     object membersValue = groupObject.Properties["Member"].Value; 
     object[] members; 

     // Does the group have any members? 
     if (membersValue == null) 
      return null; 

     // If the group has only one member, then it won't be an object array but rather a PSObject 
     if (membersValue.GetType() == typeof(PSObject)) 
     { 
      members = new object[] {membersValue}; 
     } 
     else 
     { 
      // The group has more than one member, in this case we can cast it to an object array 
      members = ((object[])membersValue); 
     } 

     // use PSObject to access the object's properties 
     foreach (PSObject member in members) 
     { 
      string objectClass = member.Properties["ObjectClass"].Value.ToString(); 
      Guid objectGuid = new Guid (member.Properties["objectGuid"].Value.ToString()); 

      ADObject memberObject; 

      switch (objectClass) 
      { 
       case "user": 
        // You might want to check for null here as well before getting the values from these properties 
        string givenName = member.Properties["GivenName"].Value.ToString(); 
        string surname = member.Properties["Surname"].Value.ToString(); 
        string displayName = member.Properties["DisplayName"].Value.ToString(); 
        [...] 
関連する問題