在c#中创建AD-User

时间:2013-07-03 12:01:44

标签: c# .net active-directory

我正在尝试使用以下代码创建一个新的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();

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

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

现在我要

  

错误:System.Exception._COMPlusExceptionCode -532459699

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

3 个答案:

答案 0 :(得分:2)

我并非100%确定导致您出现问题的原因,但有一件事可能会让您感觉更轻松,并且可能会因为您在同一时间使用DirectoryServicesDirectoryServices.AccountManagement而错误地清除错误时间是creating a new class that includes the company attribute

实际上并不难做到。

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我发现您正在使用UserPrincipal中的凭据

创建DirectoryEntry时是否忘记使用它们? 此外,您需要在服务器名称

之前添加“LDAP://”

尝试类似:

DirectoryEntry duser = new DirectoryEntry("LDAP://" + distname);
duser.Username = account;
duser.Password = passwd;
duser.AuthenticationType = AuthenticationTypes.Secure;