Prinzipalerweiterungen

Die AccountManagement-API stellt drei verschiedene Verzeichnisobjektklassen zur Verfügung: UserPrincipal, GroupPrincipal und ComputerPrincipal. Da das Verzeichnisschema geändert werden kann und nicht jedes Attribut im Schema durch eine Eigenschaft dieser Prinzipalobjekte dargestellt wird, können Entwickler eigene benutzerdefinierte Prinzipalobjekte erstellen wollen. Die Klassen Principal, AuthenticablePrincipal, UserPrincipal, ComputerPrincipal und GroupPrincipal können erweitert werden, um benutzerdefinierte Objekte zu erstellen, die das Objektmodell erweitern.

Erweiterte Klassen können neue Eigenschaften zum Objektmodell hinzufügen oder vorhandene Eigenschaften aus der erweiterten Klasse entfernen. Die Eigenschaften, die zu der erweiterten Klasse hinzugefügt werden, müssen im Schema für das Verzeichnis unterstützt werden. Nur das Anwendungsverzeichnis und die Domänenschemas können erweitert werden, um neue Eigenschaftstypen zu unterstützen. Das SAM-Verzeichnis des Computers unterstützt keine Erweiterungen. Die hier gezeigten Attribute werden von der AccountManagement-API benötigt, um Erweiterungsobjekte zu erstellen:

  • DirectoryPropertyAttribute: Die Zuordnung der Prinzipalobjekteigenschaft zum entsprechenden Objekt im Verzeichnis. Dieses Attribut wird in der Eigenschaft der abgeleiteten Klasse festgelegt. Die DirectoryPropertyAttribute-Klasse enthält die SchemaAttributeName-Eigenschaft.
  • DirectoryRdnPrefixAttribute: Das RDN-Präfix, das zum Erstellen des Objekts verwendet wird. Diese Eigenschaft wird in der abgeleiteten Klasse festgelegt. Dieses Attribut ist für die abgeleitete Klasse optional. Wenn kein RDN-Präfix für die abgeleitete Klasse festgelegt wird, wird von der AccountManagement-API das RDN-Standardpräfix "CN" übergeben. Die DirectoryRdnPrefixAttribute-Klasse enthält die RdnPrefix-Eigenschaft.
  • DirectoryObjectClassAttribute: Die Objektklasse im Schema, die vom Speicher in ein neues Objekt im Verzeichnis eingefügt wird. Die DirectoryObjectClassAttribute-Klasse enthält die ObjectClass-Eigenschaft.

Im folgenden Beispielcode wird die Erweiterung der Benutzerprinzipalklasse veranschaulicht. Das RDN-Präfix wird auf den Standardwert CN festgelegt. Weiterhin wird die InetOrgPerson-Objektklasse zum Verzeichnis hinzugefügt. Über diese Klasse wird außerdem die Verzeichniseigenschaft mobile hinzugefügt.

Die Methoden ExtensionGet und ExtensionSet werden verwendet, um die Eigenschaften der Erweiterungsklasse zu erstellen und festzulegen. Sie werden in der Erweiterungsklasse im folgenden Beispiel umfassend verwendet:

[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);
        }

    }

Verwenden der erweiterten Klasse

Im folgenden Codebeispiel wird veranschaulicht, wie Sie ein neues InetOrgPerson-Objekt erstellen und in den Speicher einfügen. Im Beispiel wird auch die Verwendung der Suchfunktion veranschaulicht, um InetOrgPerson-Objekte zu suchen.

            // 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())
                {

                }
            }

Gruppenobjekte

Wenn Gruppenobjekte durch die GetMembers-Methode erweitert werden, können in der erweiterten Gruppe erweiterte Objekttypen vorhanden sein. Da das Gruppenobjekt die erweiterten Objekttypen nicht kennt, erstellt die AccountManagement-API für die Darstellung von Gruppenmembern, die erweiterte Typen sind, ein AuthenticablePrincipal-Objekt. Mit den Schnittstellen des AuthenticablePrincipal-Objekts können die erweiterten Objekttypen verwaltet werden, die in der Gruppe enthalten sind. Anwendungen können den Objekttyp auch mithilfe der StructuralObjectClass-Eigenschaft ermitteln und eine objektspezifischere Bearbeitung ausführen.

Siehe auch

Referenz

System.DirectoryServices.AccountManagement

Konzepte

Informationen zu System.DirectoryServices.AccountManagement
Verwenden von System.DirectoryServices.AccountManagement

Send comments about this topic to Microsoft.

Copyright © 2008 Microsoft Corporation. Alle Rechte vorbehalten.