3

我正在尝试使用以下代码创建一个新的 AD 用户:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "Domain", "ou=some_ou, dc=Mydomain");
UserPrincipal user = new UserPrincipal(ctx, account, passwd, true);
user.GivenName = Givenname;
user.Surname = Surname;
user.DisplayName = Displayname;
user.UserPrincipalName = account + "@Domain";                
user.Save();

用户创建没有错误。但我还必须设置地址等属性,所以代码继续:

string distname = user.DistinguishedName;
DirectoryEntry duser = new DirectoryEntry(distname);
try
{
    duser.Properties["company"].Value = "Company";
}
catch (Exception e)
{
}

现在我得到

错误:System.Exception._COMPlusExceptionCode -532459699

该字符串distname显示正确的专有名称。

4

3 回答 3

2

我不是 100% 确定是什么导致了你的问题,但有一件事可能会让你的事情变得更容易,并且可能会因为你不正确地使用这两种方法而清除一些错误,DirectoryServices同时DirectoryServices.AccountManagement创建一个包含公司属性的新类

它实际上并不难做到。

[DirectoryObjectClass("user")]
[DirectoryRdnPrefix("CN")]
public class UserPrincipalEx : UserPrincipal
{
    public UserPrincipalEx(PrincipalContext context) : base(context) { }

    public UserPrincipalEx(PrincipalContext context, string samAccountName, string password, bool enabled)
        : base(context, samAccountName, password, enabled)
    {
    }

    [DirectoryProperty("company")]
    public string Company
    {
        get
        {
            if (ExtensionGet("company").Length != 1)
                return null;

            return (string)ExtensionGet("company")[0];

        }
        set { this.ExtensionSet("company", value); }
    }
}

然后,您可以将代码修改为

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "Domain", "ou=some_ou, dc=Mydomain");
UserPrincipalEx user = new UserPrincipalEx(ctx, account, passwd, true);
user.GivenName = Givenname;
user.Surname = Surname;
user.DisplayName = Displayname;
user.UserPrincipalName = account + "@Domain"; 
user.Company = "Company";
user.Save();

我的预感是您正在与与活动目录交互的两种方法进行某种交互,如果您切换到单个界面,您的问题可能会消失。

于 2013-07-03T13:47:05.577 回答
0

对于 DirectoryEntry,您必须指定协议(LDAP、GC、WinNT、...)。所以你必须这样做:

DirectoryEntry duser = new DirectoryEntry("LDAP://" + distname);

请注意,协议区分大小写,LDAP 必须全部大写。

于 2013-08-12T15:23:58.503 回答
0

我看到您在 UserPrincipal 中使用凭据,

您在创建 DirectoryEntry 时是否忘记使用它们?此外,您需要在服务器名称之前添加“LDAP://”

尝试类似:

DirectoryEntry duser = new DirectoryEntry("LDAP://" + distname);
duser.Username = account;
duser.Password = passwd;
duser.AuthenticationType = AuthenticationTypes.Secure; 
于 2013-08-12T15:31:49.697 回答