Extensions entités de sécurité

L'API de gestion de comptes fournit trois classes d'objets d'annuaire concrètes : UserPrincipal, GroupPrincipal et ComputerPrincipal. Le schéma d'annuaire étant modifiable et tous les attributs du schéma n'étant pas représentés par une propriété sur ces objets __entités de sécurité, les développeurs souhaitent parfois créer leurs propres objets entités de sécurité personnalisés. Les classes Principal, AuthenticablePrincipal, UserPrincipal, ComputerPrincipal et GroupPrincipal peuvent toutes être étendues pour créer des objets personnalisés qui étendent le modèle objet.

Les classes étendues peuvent ajouter de nouvelles propriétés au modèle objet ou supprimer des propriétés existantes de la classe étendue. Les propriétés qui sont ajoutées à la classe étendue doivent être prises en charge dans le schéma pour l'annuaire. Seul l'annuaire d'application et les schémas de domaine peuvent être étendus pour prendre en charge de nouveaux types de propriétés, l'annuaire Machine SAM ne gérant pas les extensions. Les attributs exposés ici sont requis par l'API de gestion des comptes pour créer des objets d'extension :

  • DirectoryPropertyAttribute Mappage de la propriété de l'objet entité de sécurité à l'objet correspondant dans l'annuaire. Cet attribut est défini sur la propriété dans la classe dérivée. La classe DirectoryPropertyAttribute contient la propriété SchemaAttributeName.
  • DirectoryRdnPrefixAttribute Préfixe de nom unique relatif utilisé pour créer l'objet. Cette propriété est définie sur la classe dérivée. Cet attribut est facultatif pour la classe dérivée. Le préfixe de nom unique relatif « CN » est fourni par l'API de gestion des comptes lorsqu'aucun préfixe de nom unique relatif n'est défini sur la classe dérivée. La classe DirectoryRdnPrefixAttribute contient la propriété RdnPrefix.
  • DirectoryObjectClassAttribute Classe d'objet du schéma insérée par le magasin dans un nouvel objet de l'annuaire. La classe DirectoryObjectClassAttribute contient la propriété ObjectClass.

L'exemple de code suivant montre comment étendre la classe entité de sécurité utilisateur. Le préfixe de nom unique relatif a la valeur CN par défaut et la classe d'objet InetOrgPerson est ajoutée à l'annuaire. La propriété d'annuaire mobile est également ajoutée par le biais de cette classe.

Les méthodes ExtensionGet et ExtensionSet permettent de créer et de remplir les propriétés de la classe d'extension et sont largement utilisées dans l'exemple de classe d'extension présenté ici :

[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("inetOrgPerson")]
public class InetOrgPerson : UserPrincipal
{
    // Inplement the constructor using the base class constructor. 
    public InetOrgPerson(PrincipalContext context) : base(context)
    {

    }
     
    // Implement the constructor with initialization parameters.    
    public InetOrgPerson(PrincipalContext context, 
                         string samAccountName, 
                         string password, 
                         bool enabled)
                         : base(context, 
                                samAccountName, 
                                password, 
                                enabled)
    {
    }

    InetOrgPersonSearchFilter searchFilter;

    new public InetOrgPersonSearchFilter AdvancedSearchFilter
    {
        get
        {
            if ( null == searchFilter )
                searchFilter = new InetOrgPersonSearchFilter(this);

            return searchFilter;
        }
    }

    // Create the mobile phone property.    
    [DirectoryProperty("mobile")]
    public string MobilePhone
    {
        get
        {
            if (ExtensionGet("mobile").Length != 1)
                return null;

            return (string)ExtensionGet("mobile")[0];
        }

        set
        {
            ExtensionSet( "mobile", value );
        }
    }
    
    // Create the other home phone property.    
    [DirectoryProperty("otherHomePhone")]
    public string[] HomePhoneOther
    {
        get
        {
            int len = ExtensionGet("otherHomePhone").Length;

            string[] otherHomePhone = new string[len];
            object[] otherHomePhoneRaw = ExtensionGet("otherHomePhone");

            for( int i = 0; i < len; i++ )
            {
                otherHomePhone[i] = (string)otherHomePhoneRaw[i];
            }
            
            return otherHomePhone;
        }

        set
        {
            ExtensionSet( "otherHomePhone", value );
        }
    }    
    
    // Create the logoncount property.    
    [DirectoryProperty("LogonCount")]
    public Nullable<int> LogonCount
    {
        get
        {
            if (ExtensionGet("LogonCount").Length != 1)
                return null;

            return ((Nullable<int>)ExtensionGet("LogonCount")[0]);
        }
    }

    // Implement the overloaded search method FindByIdentity.
    public static new InetOrgPerson FindByIdentity(PrincipalContext context, 
                                                   string identityValue)
    {
        return (InetOrgPerson)FindByIdentityWithType(context,
                                                     typeof(InetOrgPerson),
                                                     identityValue);
    }

    // Implement the overloaded search method FindByIdentity. 
    public static new InetOrgPerson FindByIdentity(PrincipalContext context, 
                                                   IdentityType identityType, 
                                                   string identityValue)
    {
        return (InetOrgPerson)FindByIdentityWithType(context, 
                                                     typeof(InetOrgPerson), 
                                                     identityType,
                                                     identityValue);
    } 


        
}

    public class InetOrgPersonSearchFilter : AdvancedFilters
    {
        public InetOrgPersonSearchFilter(Principal p) : base(p) { }
        public void LogonCount(int value, MatchType mt)
        {
            this.AdvancedFilterSet("LogonCount", value, typeof(int), mt);
        }

    }

Utilisation de la classe étendue

L'exemple de code suivant montre comment créer un objet InetOrgPerson et l'insérer dans le magasin. Cet exemple montre également comment utiliser la fonction de recherche pour les objets InetOrgPerson.

            // Create the context for the InetOrgPerson.
            using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "fabrikam", "DC=fabrikam,DC=com"))
            {

                // Create the InetOrgPerson object and set some properties on it.
                InetOrgPerson newInetPerson = new InetOrgPerson(ctx);
                newInetPerson.DisplayName = "Jim Daly";
                newInetPerson.SamAccountName = "Jim Daly";
                newInetPerson.MobilePhone = "2155550189";
                string[] phone = new string[1];
                phone[0] = "1234567";
                newInetPerson.HomePhoneOther = phone;
                newInetPerson.Save();

                // Search the directory for the new object. 
                InetOrgPerson inetPerson = InetOrgPerson.FindByIdentity(ctx,
                                                         IdentityType.SamAccountName,
                                                         "Jim Daly");



                // Search for all Inetorgperson objects that have logged on more than 5 times.
                InetOrgPerson filter = new InetOrgPerson(ctx);
                filter.AdvancedSearchFilter.LogonCount(5, MatchType.GreaterThan);
                PrincipalSearcher ps = new PrincipalSearcher(filter);

                foreach (InetOrgPerson p in ps.FindAll())
                {

                }
            }

Objets de groupe

Lorsque des objets de groupe sont développés par la méthode GetMembers, des types d'objets étendus peuvent figurer dans le groupe développé. L'objet de groupe n'ayant pas connaissance des types d'objets étendus, l'API de gestion des comptes crée un objet AuthenticablePrincipal pour représenter les membres de groupe qui sont des types étendus. Les interfaces sur l'objet AuthenticablePrincipal peuvent permettre de gérer les types d'objets étendus contenus dans le groupe. Les applications peuvent également utiliser la propriété StructuralObjectClass pour déterminer le type d'objet et procéder ensuite à des modifications plus spécifiques à l'objet.

Voir aussi

Référence

System.DirectoryServices.AccountManagement

Concepts

À propos de System.DirectoryServices.AccountManagement
Utilisation de System.DirectoryServices.AccountManagement

Send comments about this topic to Microsoft.

Copyright © 2008 par Microsoft Corporation. Tous droits réservés.