2

我正在使用 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 工具进行操作。

4

4 回答 4

2

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

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

于 2010-03-15T21:13:56.503 回答
1

尝试:

 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

于 2010-03-08T19:51:07.833 回答
0

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

于 2010-03-08T20:15:57.013 回答
0

Active Directory 复制问题可能会出现时间问题。

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

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

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

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

于 2010-04-22T20:14:06.750 回答