2016-04-05 21 views
0

C# koduma bir PowerShell komut dosyası ekledim ve C# kullanarak çağırıyorum. komut ne yaparC# ifadesinde dinamik PSObject Özellikleri çağrısı RuntimeBinderException

bazı grup ve Active Directory kendi üyelerini alır ve bir PSObject olarak benim C# kodu onları döndüren olduğunu. Bu nesne, grubun içerdiği üyelerin bir Array içeren "Üye" adlı bir özelliğe sahiptir. Bu üyelerin her biri PowerShell ile eklediğim EmailAddress, Name vb. Gibi diğer özelliklere de sahiptir ve ben de betiği test ettim, amaçlanan şekilde çalışıyor. İşte

Ben dinamik bir değişken kullanarak grup üyelerini elde etmeye çalışmak C# benim kodudur:

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(); 
      [...] 

Buradaki sorun ayıklama yaparken, ben mülkiyet dinamik orada olduğunu görüyoruz aslında olmasıdır üye değişken, ancak foreach döngüsü sırasında üye değişkeninde kaldırılır. Here's a screenshot I made during debugging, which shows clearly that the property is available in the members variable.

Ben iletiyi içeren bir RuntimeBinderException olduğunu olsun istisna (Kapatma, CallSite, Nesne, String) System.Dynamic.UpdateDelegates.UpdateAndExecute2 de CallSite.Target de "boş referans bağlayıcı çalışma zamanını gerçekleştirilemez" [T0, T1, TRet] (CallSite sitesi, T0 arg0, T1 arg1)

Belki de hata açıktır, ancak yanlış yaptığımı anlayamıyorum. Herhangi bir yardımı gerçekten takdir ederdim. Teşekkür ederim!

+0

Ekran görüntüleriniz sadece mülkiyet varolduğunu gösterir: Kimsenin hala çözüm arıyorsa ben onu çözdüm bu nasıl olduğunu hiç dynamic türü kullanmak vermedi. Mülkün gerçek değere sahip olmadığına dair hiçbir kanıt yoktur. Tam olarak özel durumun nerede olduğunu öğrenmek için komutunuzu bölmeniz gerekir: 'PSPropertyInfo property = member.Properties [" EmailAddress "]; nesne değeri = property.Value; string email = değer.ToString(); '. – PetSerAl

+0

@PetSerAl Cevabınız için teşekkürler. Sorun şu ki; member.Properties ["EmailAddress"] '' 'null'' dır ve foreach döngüsünden önce, en azından varlığın (ekran görüntüsüne dayalı olarak belirttiğiniz gibi) olduğunu görebilirim ve bu garip bir şey, Bir şekilde kaybolur ... Sizden belirtilen ifadeyi eklerken bir RuntimeBinderException alıyorum: 'PSPropertyInfo property = member.Properties [" EmailAddress "]; – lleshiart

+0

'string email = üye.EmailAddress; – PetSerAl

cevap

0

Sorunu çözmeyi başardım.

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(); 
        [...]