代码之家  ›  专栏  ›  技术社区  ›  Paolo Tedesco

在.NET中创建Active Directory用户(C)

  •  20
  • Paolo Tedesco  · 技术社区  · 15 年前

    我需要在Active Directory中创建一个新用户。我发现了以下几个例子:

    using System;
    using System.DirectoryServices;
    
    namespace test {
       class Program {
          static void Main(string[] args) {
            try {
                string path = "LDAP://OU=x,DC=y,DC=com";
                string username = "johndoe";
    
                using (DirectoryEntry ou = new DirectoryEntry(path)) {
                   DirectoryEntry user = ou.Children.Add("CN=" + username, "user");
    
                   user.Properties["sAMAccountName"].Add(username);
    
                   ou.CommitChanges();
                }
             } 
             catch (Exception exc) {
                 Console.WriteLine(exc.Message);
             }
          }
       }
    }
    

    当我运行此代码时,我不会得到任何错误,但不会创建新用户。

    我使用的运行测试的帐户有足够的权限在目标组织单位中创建用户。

    我是否缺少某些内容(可能是用户对象的某些必需属性)?

    你知道为什么代码不给出例外吗?

    编辑
    以下内容对我很有用:

    int NORMAL_ACCOUNT = 0x200;
    int PWD_NOTREQD = 0x20;
    DirectoryEntry user = ou.Children.Add("CN=" + username, "user");
    user.Properties["sAMAccountName"].Value = username;
    user.Properties["userAccountControl"].Value = NORMAL_ACCOUNT | PWD_NOTREQD;
    user.CommitChanges();
    

    所以实际上有几个问题:

    1. CommitChanges 必须接通 user (谢谢Rob)
    2. 密码策略阻止创建用户(感谢Marc)
    3 回复  |  直到 6 年前
        1
  •  16
  •   RobV    15 年前

    我想你打电话给委员会的是错误的董事会。在msdn文档中( http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentries.add.aspx )它说明了以下内容(强调由我添加)

    必须调用CommitChanges方法 在新条目上 使创造成为永久性的。调用此方法时,可以在新条目上设置强制属性值。对于需要在调用CommitChanges方法之前设置的属性,每个提供程序都有不同的要求。如果不满足这些要求,提供者可能会抛出异常。请与提供程序联系以确定在提交更改之前必须设置哪些属性。

    因此,如果您将代码更改为 user.commitchanges()。 它应该可以工作,如果您需要设置的属性不仅仅是帐户名,那么您应该得到一个异常。

    由于您当前正在对尚未更改的ou调用commitChanges(),因此不会出现异常。

        2
  •  8
  •   Adriano Carneiro Tigran    13 年前

    假设您的OU路径 OU=x,DC=y,DC=com 真的存在-它应该起作用:—)

    检查事项:

    • 你在给“samaccountname”添加一个值-为什么不设置它的值:

      user.Properties["sAMAccountName"].Value = username;
      

    否则,你可能会得到几个samaccountname——但这行不通……

    • 你没有设置 userAccountControl 属性到任何内容-尝试使用:

       user.Properties["userAccountControl"].Value = 512;  // normal account
      
    • 您的组织中是否有多个域控制器?如果您正在使用这个“无服务器”绑定(没有在LDAP路径中指定任何服务器),那么您可能会惊讶于在何处创建用户:—),并且在整个网络上进行同步需要几分钟到半小时的时间。

    • 你有严格的密码政策吗?也许这就是问题所在。我记得我们以前必须先使用“不需要密码”选项创建用户,然后首先执行.commitchanges(),然后创建足够强大的密码,对用户进行设置,然后删除该用户选项。

    马克

        3
  •  0
  •   Brad Larson    11 年前

    检查以下代码

     DirectoryEntry ouEntry = new DirectoryEntry("LDAP://OU=TestOU,DC=TestDomain,DC=local");
    
            for (int i = 3; i < 6; i++)
            {
                try
                {
                    DirectoryEntry childEntry = ouEntry.Children.Add("CN=TestUser" + i, "user");
                    childEntry.CommitChanges();
                    ouEntry.CommitChanges();
                    childEntry.Invoke("SetPassword", new object[] { "password" });
                    childEntry.CommitChanges();
                }
                catch (Exception ex)
                {
    
                }
            }