1

PersonADオブジェクトを取得および更新/作成するための WCF サービスを作成していますが、問題が発生しました。拡張属性を管理するための拡張クラスを作成しました (提供されたスキーマ属性ですが、デフォルトのアカウント管理クラスの属性セットにはありません)。これらの拡張属性の取得または更新に問題はありませんが、AD で新しい人物オブジェクトを作成しようとすると、制約違反が発生します

System.DirectoryServices.DirectoryServicesCOMException: 制約違反が発生しました。

現在、Windows 8.1 デスクトップの Visio 2013 のデバッグ モードでこれをテストしています。以下のコード。誰でも提供できるヒントや洞察は大歓迎です。

以下のコードが十分に文書化されていて、理にかなっていることを願っています。前もって感謝します!

更新:もっと明確にするべきでした。拡張属性であると確信している理由は、エラーなしでオブジェクトを作成する属性を設定する呼び出しコード (現在は以下のコード セクションでコメントされています) の行をコメント アウトするときです。

これは私の呼び出しコードです:

....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);
            }
        }
    }
}    
4

2 に答える 2

2

マークに感謝します。そのヒントが解決に役立ちました。拡張コンストラクターにコンテナーの新しいパラメーターを追加し、それでうまくいきました。

拡張クラスのコンストラクターを変更して、既定のコンテナーを追加しました。新しいコンストラクターは次のようにリストされます。

public ADeXt(
    PrincipalContext context,
    **string Container,**
    string samAccountName,
    string password,
    bool enabled
    )
    : base(
       context,
       samAccountName,
       password,
       enabled
       ) {
}
于 2014-11-14T18:41:07.683 に答える