【问题标题】:Adding User to AD Security Group fails after user creation创建用户后将用户添加到 AD 安全组失败
【发布时间】:2010-03-08 19:41:31
【问题描述】:

我正在使用 WCF 服务向我们的技术支持人员公开某些 Active Directory 管理功能,而没有向他们提供直接操作 AD 所需的组成员身份。在组中添加用户和从组中删除用户就像与现有用户的冠军一样,但每次我创建一个新用户时,它都会抛出这个有趣的代码:

The server is unwilling to process the request. (Exception from HRESULT: 0x80072035)

我用来将用户添加到组的代码是

    public bool AddGroupToUser(string userDn, string groupDn)
    {
        try
        {
            DirectoryEntry groupEntry = LdapTools.GetDirectoryEntry(groupDn);
            groupEntry.Properties["member"].Add(userDn);
            groupEntry.CommitChanges();
            groupEntry.Close();
            return true;
        }
        catch (DirectoryServicesCOMException)
        {
            return false;
        }
    }

我读到的关于这个主题的所有内容都相当模糊,我似乎无法找出触发异常的原因。有什么想法吗?

更新

这是我用来在 AD 中创建用户的代码:

        try
        {
            DirectoryEntry container = GetDirectoryEntry(storageOu);
            DirectoryEntry newUser = container.Children.Add("CN=" + employee.FullName, "user");
            newUser.Properties["sAMAccountName"].Value = employee.Username;
            newUser.Properties["displayName"].Value = employee.FullName;
            newUser.Properties["givenName"].Value = employee.FirstName;
            newUser.Properties["sn"].Value = employee.LastName;
            newUser.Properties["department"].Value = departmentName;
            newUser.Properties["userPrincipalName"].Value = employee.Username + "@APEX.Local";
            newUser.CommitChanges();

            newUser.Invoke("SetPassword", new object[] { employee.Password });
            newUser.CommitChanges();

            AdsUserFlags userSettings = AdsUserFlags.NormalAccount;
            newUser.Properties["userAccountControl"].Value = userSettings;
            newUser.CommitChanges();

            ldapPath = newUser.Path;

            newUser.Close();
            container.Close();
        }
        catch (DirectoryServicesCOMException e)
        {
            // Something went wrong... what???
        }
        catch (Exception e)
        {
            // Something else went wrong
        }

新用户可以登录,并且可以使用标准的 MS 工具进行操作。

【问题讨论】:

    标签: c# active-directory directoryservices


    【解决方案1】:

    显然,除非我在这里遗漏了一个重要步骤,否则问题就是时间。在尝试将组添加到新用户之前强制系统休眠 8 秒时,该过程有效。如果我在 8 秒标记之前完成它,它就会失败。

    除非有人可以为我提供更好的解决方案,否则我将此答案标记为正确。

    【讨论】:

    • 我认为 DirectoryEntry 原语不能保证在内部使用相同的 AD 绑定,因此您完全有可能在与您添加用户的域控制器不同的域控制器上操作组(AD 使用多主机复制模型)。完成复制所需的时间取决于域控制器的数量、确定通知对等方更改之前等待多长时间的设置以及 AD 事务量。在大型域中,我发现 AD 需要 5 分钟以上才能完全复制 SPN,因此请注意 8 秒。
    • 我围绕 DirectoryEntry 编写了一个包装器,旨在解决不知道我要连接到哪个域控制器的问题。我现在每次都连接到同一个 DC,但在 8 秒时间段过去之前,它仍然无法识别后续调用中的 DirectoryEntry。幸运的是,至少现在,我只需要担心两个 DC。如果我们开始为每个位置添加一个 DC,天堂会帮助我。您是否知道一种方法可以确定 SPN 何时被完全复制?
    【解决方案2】:

    试试:

     public bool  AddUserToGroup(string userName, string groupName)
    
            {
    
                bool done = false;
    
                GroupPrincipal group = GroupPrincipal.FindByIdentity(context, groupName);
    
                if (group == null)
    
                {
    
                    group = new GroupPrincipal(context, groupName);
    
                }
    
                UserPrincipal user = UserPrincipal.FindByIdentity(context, userName);
    
                if (user != null & group != null)
    
                {
    
                    group.Members.Add(user);
    
                    group.Save();
    
                    done = (user.IsMemberOf(group));
    
                }
    
                return done;
    
            }
    

    参考:
    http://www.c-sharpcorner.com/UploadFile/dhananjaycoder/activedirectoryoperations11132009113015AM/activedirectoryoperations.aspx

    【讨论】:

      【解决方案3】:

      正如here中提到的,你能告诉我们你设置了新创建用户的密码吗?在参考资料中,它说您应该在对用户进行任何操作之前设置用户的密码。

      【讨论】:

      • 您也可以在experts-exchange.com/Programming/Misc/Q_21962620.html查看接受的解决方案
      • 查看我添加到问题中的代码更新,我添加了我的用户创建代码。
      • 我在我的公司使用相同的代码,除了我的用户的 userAccountControl 属性也具有“密码不会过期”值。 (ActiveDs.ADS_USER_FLAG.ADS_UF_DONT_EXPIRE_PASSWD) 你也可以试试设置这个值吗?
      【解决方案4】:

      Active Directory 复制问题可能会导致时间问题。

      有一次,我向我的客户提供了一个产品,它通过 Active Directory 创建用户,其中包含超过 10.000 条记录,并在 SharePoint 表单上包含给定的信息,然后程序将用户添加到 SharePoint 组。问题是,SharePoint 抛出一个关于新创建用户的错误,它说用户在 AD 中不存在。

      因此,一位系统工程师告诉我们有关 Active Directory 上的复制操作,这可能是问题的根源,这是真的。

      对于解决方案,程序尝试在 1 秒睡眠的情况下执行 10 次工作。到目前为止没有出现任何问题。因此,作为一种解决方案,我建议您检查 AD 是否存在复制方法。

      P.S:当我向我的客户系统工程师询问有关复制操作的问题时,他们都拒绝了 AD 复制操作的存在,并告诉我程序有问题。当我们从一台计算机在 AD 中创建一个新用户时,他们相信我,我们在另一台计算机上 5 秒内看不到该用户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-19
        • 2019-01-11
        • 1970-01-01
        • 2015-09-03
        相关资源
        最近更新 更多