Добавление пользователя в группу безопасности AD завершается неудачно после создания пользователя - PullRequest
2 голосов
/ 08 марта 2010

Я использую службу 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;
        }
    }

Все, что я прочитал на эту тему, довольно расплывчато, и я не могу понять, ПОЧЕМУ возникает исключение. Есть идеи?

UPDATE

Это код, который я использую для создания пользователя в 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 ]

2 голосов
/ 16 марта 2010

Видимо, если я не пропущу важный шаг, проблема в времени. Когда система переходит в спящий режим на 8 секунд, прежде чем пытаться добавить группы новому пользователю, процесс работает. Если я сделаю это раньше, чем 8-секундная отметка, это не получится.

Я отмечаю этот ответ как правильный, если никто не может предложить мне лучшее решение.

1 голос
/ 08 марта 2010

Попробуйте:

 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

0 голосов
/ 23 апреля 2010

Проблема времени может возникнуть из-за проблемы репликации Active Directory.

Однажды я передал продукт своему клиенту, который создает пользователя через Active Directory, в котором содержится более 10 000 записей, с предоставленной информацией в форме SharePoint, а затем программа добавляет пользователя в группу SharePoint. Проблема была в том, что SharePoint выдает ошибку о вновь созданном пользователе, он говорит, что пользователь не существует в AD.

Итак, один из системных инженеров рассказал нам об операции репликации в Active Directory, что это может быть источником проблемы, и это было правдой.

Для решения, программа пытается выполнить работу 10 раз с 1 секундами сна. Никаких проблем не произошло до сих пор. Поэтому в качестве решения я бы предложил вам проверить AD на наличие метода репликации.

P.S .: Когда я задавал вопросы своим системным инженерам о работе репликации, все они отвергали существование операции репликации AD и говорили мне, что в программе есть проблема. Они поверили мне, когда мы создали нового пользователя в AD с компьютера, мы не могли видеть пользователя в течение 5 секунд на другом компьютере.

0 голосов
/ 08 марта 2010

Как упоминалось в здесь , можете ли вы сказать нам, что вы устанавливаете пароль для вновь созданных пользователей? В ссылке говорится, что вы должны установить SetPassword пользователя, прежде чем что-либо делать с ним.

...