Нарушение ограничений при создании объекта пользователя AD с атрибутами класса расширения управления учетными записями

Я создаю службу WCF для извлечения и обновления / создания AD Person объекты, и столкнулись с загадкой. Я создал класс расширений для управления расширенными атрибутами (атрибуты поставляемой схемы, но не в наборе атрибутов класса управления учетными записями по умолчанию). У меня нет проблем с получением или обновлением этих расширенных атрибутов, но когда я пытаюсь создать новый объект person в AD, я получаю нарушение ограничения

System.DirectoryServices.DirectoryServicesCOMException: произошло нарушение ограничения.

В настоящее время я тестирую это в режиме отладки в Visio 2013 на рабочем столе Windows 8.1. Код ниже. Любые намеки или идеи, которые может предложить кто-либо, приветствуются

Надеемся, что приведенный ниже код задокументирован достаточно хорошо и имеет смысл. Заранее спасибо!

Обновление: я должен был быть более ясным. Причина, по которой я почти уверен, что это атрибуты расширения, заключается в том, что, когда я закомментирую эти строки в вызывающем коде (теперь прокомментирован в разделе кода ниже), которые устанавливают эти атрибуты, он будет создавать объект без ошибок.

Это мой код вызова:

....other code.....

PrincipalContext pc = null;

try {
    pc = new PrincipalContext(ContextType.Domain, MyProject.ADAccountService.Properties.Settings.Default.Domain, MyProject.ADAccountService.Properties.Settings.Default.PeopleDN, MyProject.ADAccountService.Properties.Settings.Default.AdminAcct, MyProject.ADAccountService.Properties.Settings.Default.AdminPW);
}
catch (Exception e) {
    defaultLogger.Warn(MyProject.ADAccountService.App_GlobalResources.Messages.PrincipalContextCreateFail, e);
    // Application.Exit();
}

....other code looking for whether ADObject already exists...

// Create the new UserPrincipal object
if (!newADPerson.personExists) {
    using (ADeXt userNew = new ADeXt(pc)) {

        string randomPassword = System.Web.Security.Membership.GeneratePassword(20, 4);
        if (newADPerson.officePhone != null && newADPerson.officePhone.Length > 0) { userNew.VoiceTelephoneNumber = newADPerson.officePhone; }
        if (newADPerson.department != null && newADPerson.department.Length > 0) { userNew.department = newADPerson.department; } //offending codeline
        if (newADPerson.title != null && newADPerson.title.Length > 0) { userNew.title = newADPerson.title; } //offending codeline
        if (newADPerson.faxNumber != null && newADPerson.faxNumber.Length > 0) { userNew.facsimileTelephoneNumber = newADPerson.faxNumber; } //offending codeline
        if (newADPerson.officeLocation != null && newADPerson.officeLocation.Length > 0) { userNew.physicalDeliveryOfficeName = newADPerson.officeLocation; } //offending codeline
        if (newADPerson.isEmployee) {
            //if an employee and (newADPerson.script == null) use default value from global project settings
            userNew.ScriptPath = newADPerson.script ?? MyProject.ADAccountService.Properties.Settings.Default.defaultScript;
        }

        if (newADPerson.lastName != null && newADPerson.lastName.Length > 0) { userNew.Surname = newADPerson.lastName; }
        if (newADPerson.firstName != null && newADPerson.firstName.Length > 0) { userNew.GivenName = newADPerson.firstName; }
        if (newADPerson.emplID != null) { userNew.EmployeeId = newADPerson.emplID; }
        if (newADPerson.displayName != null && newADPerson.displayName.Length > 0) { userNew.DisplayName = newADPerson.displayName; }

        userNew.SamAccountName = AccountID;
        userNew.Name = AccountID;
        userNew.UserPrincipalName = AccountID + MyProject.ADAccountService.Properties.Settings.Default.ExchangeAddress;

        try {
            userNew.Save();
            userNew.SetPassword(randomPassword);
        }
        catch (Exception e) {

            pc.Dispose();
        }
    }
}

Код класса расширения:

namespace MyProject.ADAccountService.Classes {
    [DirectoryObjectClass("user")]
    [DirectoryRdnPrefix("CN")]
    class ADeXt : UserPrincipal {
        public ADeXt(PrincipalContext context)
            : base(context) {
        }

        public ADeXt(
            PrincipalContext context,
string Container, //new constructor parameter added resolving issue
            string samAccountName,
            string password,
            bool enabled
            )
            : base(
               context,
               samAccountName,
               password,
               enabled
               ) {
        }

        public static new ADeXt FindByIdentity(PrincipalContext context, string identityValue) {

            return (ADeXt)FindByIdentityWithType(context, typeof(ADeXt), identityValue);
        }

        [DirectoryProperty("physicalDeliveryOfficeName")]
        public string physicalDeliveryOfficeName {
            get {
                object[] result = this.ExtensionGet("physicalDeliveryOfficeName");
                if (result != null) {
                    return (string)result[0];
                }
                else {
                    return null;
                }
            }
            set {
                this.ExtensionSet("physicalDeliveryOfficeName", value);
            }
        }

        [DirectoryProperty("department")]
        public string department {
            get {
                object[] result = this.ExtensionGet("department");
                if (result != null) {
                    return (string)result[0];
                }
                else {
                    return null;
                }
            }
            set {
                this.ExtensionSet("department", value);
            }
        }

        [DirectoryProperty("title")]
        public string title {
            get {
                object[] result = this.ExtensionGet("title");
                if (result != null) {
                    return (string)result[0];
                }
                else {
                    return null;
                }
            }
            set {
                this.ExtensionSet("title", value);
            }
        }

        [DirectoryProperty("facsimileTelephoneNumber")]
        public string facsimileTelephoneNumber {
            get {
                object[] result = this.ExtensionGet("facsimileTelephoneNumber");
                if (result != null) {
                    return (string)result[0];
                }
                else {
                    return null;
                }
            }
            set {
                this.ExtensionSet("facsimileTelephoneNumber", value);
            }
        }
    }
}    

2 ответа

Спасибо Марк, этот намек помог мне решить. добавил новый параметр для контейнера в конструкторе расширений, и это помогло.

Изменен конструктор в классе расширений для добавления контейнера по умолчанию. Новый конструктор теперь выглядит так:

public ADeXt(
    PrincipalContext context,
    **string Container,**
    string samAccountName,
    string password,
    bool enabled
    )
    : base(
       context,
       samAccountName,
       password,
       enabled
       ) {
}

Для тех, кто ищет эту ошибку. Это может означать многое, первые результаты Google покажут, что это как-то связано с эмулятором PDC или репликацией.

В моем случае это произошло из-за слишком большого количества символов для идентификатора сотрудника (максимум 16). Иногда это инициалы (максимум 6) или samAccountName (максимум 19). Просто очистите поля, пока они не станут отправной точкой.

Другие вопросы по тегам