2

Je veux étendre la classe GroupPrincipal pour gérer des propriétés personnalisées:Extension GroupPrincipal et les membres propriété

using System.DirectoryServices.AccountManagement; 

[DirectoryRdnPrefix("CN")] 
[DirectoryObjectClass("group")] 
public class MyGroupPrincipal : GroupPrincipal { 
    // ... 
} 

Comment pourrais-je remplacer la propriété Members pour MyGroupPrincipal de sorte que si elle a un membre qui est un groupe d'une instance de MyGroupPrincipal et non de GroupPrincipal est renvoyé? Je voudrais écrire par exemple

MyGroupPrincipal group = GetGroup(); 
foreach (var m in group.Members) { 
    if (m is MyGroupPrincipal) { // always fails: m is a normal GroupPrincipal 
     // do something 
    } 
} 

Répondre

1

Il n'y a pas moyen de passer outre directement la propriété de membres GroupPrincipal. Au lieu de cela, vous pouvez lancer votre propre méthode (désolé pour aucun code propre, mais j'ai utilisé des parties de la solution décrite ci-dessous à travers mon code).

J'ai trouvé cela plusieurs fois avec la bibliothèque AccountManagement que vous avez juste besoin d'utiliser la base DirectoryEntry pour faire les choses correctement. Vous pouvez accéder à l'objet de base en utilisant group.GetUnderlyingObject(), puis lire l'appartenance en itérant deGroup.Properties("member"). Lire chaque type de membre (je ne me souviens pas du nom de la propriété, peut-être 'member.SchemaClassName'?) Et distinguishedName (member.Properties("distinguishedName")(0).ToString()) Ensuite, créez une instruction switch basée sur le type où vous créez chaque principal en utilisant le nom distinctif MyGroupPrincipal.FindByIdentity(context, distinguishedName), et faites de même pour utilisateurs, etc ...