2016-04-05 5 views
0

Ich habe ein PowerShell-Skript in meinen C# -Code integriert und rufe es mit C# auf.Der Aufruf von dynamischen PSObject-Eigenschaften in C# gibt RuntimeBinderException zurück

Was das Skript tut, ist es einige Gruppen und ihre Mitglieder aus Active Directory wird und gibt sie in meinem C# -Code als PSObject. Dieses Objekt hat eine Eigenschaft namens "Member", die ein Array von Mitgliedern enthält, die die Gruppe enthält. Jedes dieser Mitglieder hat andere Eigenschaften wie EmailAddress, Name usw., die ich über PowerShell hinzugefügt habe und ich habe auch das Skript getestet, es funktioniert wie beabsichtigt.

Hier ist mein Code in C#, wo ich versuchen, die Gruppenmitglieder mit einer dynamischen Variable zu erhalten:

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

Das Problem hierbei ist, dass beim Debuggen, ich kann tatsächlich sehen, dass die Immobilie in der dynamischen gibt es Mitglieder Variable, aber es wird in der Mitglied Variable während der foreach-Schleife entfernt. Here's a screenshot I made during debugging, which shows clearly that the property is available in the members variable.

Die Ausnahme, die ich bekommen ein RuntimeBinderException mit der Meldung bei CallSite.Target (Closure, CallSite, Object, String) bei System.Dynamic.UpdateDelegates.UpdateAndExecute2 "auf einem Null-Referenzlaufzeit Bindung kann nicht ausgeführt" ist [T0, T1, TRet] (CallSite Website, T0 arg0, T1 arg1)

Vielleicht ist der Fehler klar, aber ich kann nicht herausfinden, was ich falsch mache. Würde mich über jede Hilfe freuen. Vielen Dank!

+0

Ihr Screenshot nur zeigen, dass Eigenschaft vorhanden ist. Es gibt keinen Hinweis darauf, dass die Eigenschaft tatsächlich keinen Nullwert hat. Sie müssen Ihren Befehl teilen, um zu wissen, wo genau die Ausnahme auftritt: 'PSPropertyInfo property = member.Properties [" EmailAddress "]; Objektwert = property.Value; Zeichenfolge email = Wert.ToString(); '. – PetSerAl

+0

@PetSerAl Danke für die Antwort. Das Problem ist, dass 'member.Properties [" EmailAddress "]' tatsächlich 'null' ist, und vor der foreach-Schleife kann ich sehen, dass die Eigenschaft mindestens existiert (wie Sie auf dem Screenshot erwähnt haben), und das ist das Seltsame, irgendwie geht es verloren ... Ich bekomme eine RuntimeBinderException, wenn ich die von Ihnen erwähnte Anweisung hinzufüge: 'PSPropertyInfo property = member.Properties [" EmailAddress "]; ' – lleshiart

+0

' string email = member.EmailAddress; ' – PetSerAl

Antwort

0

Ich habe es geschafft, das Problem zu lösen. Ich habe nicht verwenden, um den dynamic Typen überhaupt, das ist, wie ich es gelöst, wenn jemand noch nach einer Lösung gesucht wird:

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