Пользователь, созданный с использованием System.DirectoryServices.AccountManagement, не может получить доступ к сайту Sharepoint. - PullRequest
0 голосов
/ 07 марта 2019

Соответствующий код: - Эта работа еще не завершена, и я все еще на стадии обнаружения, поэтому не все пути исключений завершены. Никаких ухищрений насчет повторных исключений - я доберусь до этого.

Я также должен сказать, что у меня минимальный опыт работы с AD. Это никогда не подходило мне раньше.

Большая часть кода взята из примеров Microsoft.

public static bool AddUser(string firstName, string lastName, string userLogonName,
    string employeeID, string emailAddress, string telephone, string address,
    string Password, DateTime expiry)
{
    PrincipalContext principalContext = GetContext();

    // Check if user object already exists in the store
    if (UserExists(userLogonName))
    {
        throw new Exception(userLogonName + " already exists. Please use a different User Logon Name.");
    }

    // Create the new UserPrincipal object
    UserPrincipal userPrincipal = new UserPrincipal(principalContext);

    if (lastName != null && lastName.Length > 0)
    {
        userPrincipal.Surname = lastName;
    }

    if (firstName != null && firstName.Length > 0)
    {
        userPrincipal.GivenName = firstName;
    }

    if (employeeID != null && employeeID.Length > 0)
    {
        userPrincipal.EmployeeId = employeeID;
    }

    if (emailAddress != null && emailAddress.Length > 0)
    {
        userPrincipal.EmailAddress = emailAddress;
    }

    if (telephone != null && telephone.Length > 0)
    {
        userPrincipal.VoiceTelephoneNumber = telephone;
    }

    if (userLogonName != null && userLogonName.Length > 0)
    {
        userPrincipal.SamAccountName = userLogonName;
    }

    userPrincipal.AccountExpirationDate = expiry;


    userPrincipal.SetPassword(Password);

    userPrincipal.Enabled = true;
    userPrincipal.PasswordNeverExpires = true;

    try
    {
        userPrincipal.Save();
    }
    catch (Exception e)
    {
        throw new Exception("Exception saving user object. ", e);
    }
    return true;
}

И

public static void AddUserToGroup(string userLogonName, string groupName)
{
    try
    {
        using (PrincipalContext principalContext = GetContext())
        {
            GroupPrincipal group = GroupPrincipal.FindByIdentity(principalContext, groupName);
            group.Members.Add(FindUser(userLogonName));
            group.Save();
        }
    }
    catch (System.DirectoryServices.DirectoryServicesCOMException e)
    {
        throw e;
    }
}

Когда я запускаю свой тест (добавить пользователя) и проверяю Active Directory, пользователь там. Все идет нормально.

Затем я запустил тест добавления в группу, и пользователь показывается как группа MemberOf в AD. Опять же, все как и ожидалось.

Теперь я перехожу на сайт Sharepoint и пытаюсь войти в систему как вновь созданный пользователь. Я получаю сообщение «Извините, этот сайт вам не предоставлен».

... Интерлюдия: много возни вокруг групп и прав доступа безрезультатно ...

Затем я вручную создал пользователя в AD, а затем запустил тест «Добавить в группу». В AD все выглядит хорошо, и я могу успешно войти на сайт Sharepoint.

Итак, я подозреваю, что что-то не так с методом AddUser, но я не могу понять, что. Я не вижу разницы между пользователем, созданным программно, и пользователем, созданным вручную.

1 Ответ

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

Как уже упоминалось в наших комментариях, просто подождите, пока ваши изменения будут реплицированы на все контроллеры домена, прежде чем приступать к тестированию.

В зависимости от того, как написан ваш метод GetContext(), у вас могут возникнуть проблемы с репликацией при создании учетной записи. Если он каждый раз создает новый PrincipalContext объект, он теоретически может подключиться к другому DC во второй раз, когда новая учетная запись еще не существует. (хотя он пытается соединить вас с ближайшим, поэтому он, вероятно, всегда будет одним и тем же)

Чтобы избежать какого-либо шанса получить другой DC, вы можете либо повторно использовать тот же объект PrincipalContext, либо прочитать свойство ConnectedServer PrincipalContext, которое сообщит вам, какой DC это закончилось использованием. Затем вы можете использовать это позже, чтобы убедиться, что вы вносите все изменения в один и тот же DC.

Конструктор для PrincipalContext позволит вам передать конкретный DC в качестве имени домена, если вы хотите настроить таргетинг на конкретный DC:

var context = new PrincipalContext(ContextType.Domain, "dc1.domain.com");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...