【问题标题】:PrincipalExistsException is thrown, but the Principal doesn't actually exist抛出 PrincipalExistsException,但 Principal 实际上并不存在
【发布时间】:2012-08-21 22:25:13
【问题描述】:

鉴于以下代码,当我知道主体不存在且实际上并未生成的事实时,为什么我会得到 PrincipalExistsException

public UserPrincipal Add(
    string givenName,
    string surname,
    string domain) {
    UserPrincipal principal = new UserPrincipal(context: base.Context) {
        Enabled = true
    };

    if (!String.IsNullOrEmpty(givenName) && !String.IsNullOrEmpty(surname) && !String.IsNullOrEmpty(domain)) {
        this.RenameInternal(principal: principal, givenName: givenName, surname: surname, domain: domain);

        principal.Save();
    };

    return principal;
}

我可以确认RenameInternal() 方法工作得很好,因为它被一个名为Rename() 的方法调用。因此,对象的创建和/或保存方式肯定存在问题,但我不知道如何找出错误所在。这看起来很简单的代码......

查看域控制器 (Windows Server 2008 R2) 我无法在任何地方找到“新”创建主体,因此我假设它没有被创建并且异常以某种方式欺骗了我。

如果能提供任何帮助,我将不胜感激。提前致谢。

【问题讨论】:

    标签: c# active-directory windows-server-2008-r2 directoryservices


    【解决方案1】:

    好的,我想通了。 SamAccountName 是导致抛出异常的原因(感谢 Microsoft 提供的有用的错误消息)。无论如何,这是问题所在,因为它试图将其设置为已经存在的名称。我通过在中间名首字母中折腾来修改它,它工作正常,或者至少直到我得到具有相同首字母、中间首字母和姓氏的人。

    【讨论】:

    • 您可以通过在 Active Directory 中打开查找 UI、在高级选项卡上创建自定义搜索并搜索“samaccountname=**”来检查这一点。
    【解决方案2】:

    我能想到的唯一的事情就是以下

    无论您的应用程序在什么 ID 下运行,都需要对 AD 具有“写入”权限。几乎任何 ID 都可以查询 AD,但只有明确授予权限的 ID 才能写入。

    【讨论】:

    • 嗯,我有一个特殊帐户,已被授予管理权限。我什至将该帐户添加到具有读写访问权限的Domain Users OU,但它仍然出错。使用完全相同的帐户,我可以毫无问题地创建GroupPrincipals。
    • 好吧,我发现它来自SamAccountName 属性,它不会让我在创建时更改它。如果我重命名我在域控制器中手动创建的UserPrincipal,我可以更改它,但如果UserPrincipal 是通过我的应用程序创建的,它不会让我在创建时设置它或重命名它。什么鬼?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2022-01-11
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    相关资源
    最近更新 更多