Управление пользователями на удаленном сервере Windows с помощью C# System.DirectoryServices

Я написал программу, которая открывает соединение с удаленным сервером Windows для управления локальными учетными записями (не Active Directory). Программа выполняет следующие шаги:

  • Создание пользователя
  • Добавить пользователя в группу

Оба метода используют System.DirectoryServices.AccountManagement, здесь две функции:

public void CreateUser()
    {
        PrincipalContext pc = new PrincipalContext(ContextType.Machine,
            "host_ip",
            "adminaccount",
            "adminpassword");
        UserPrincipal up = new UserPrincipal(pc);

        up.Name = "user";
        up.DisplayName = "user";
        up.SetPassword("user");
        up.Description = "user";
        up.UserCannotChangePassword = true;
        up.PasswordNeverExpires = true;
        try
        {
            up.Save();
        }
        catch (Exception ex)
        {
        }
        try
        {
            AddToGroup(pc, up);
        }
        catch (Exception ex)
        {
        }
    }

    private void AddToGroup(PrincipalContext pc, UserPrincipal u)
    {
        string group = "Remote Desktop Users";

        GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(pc, group);
        if (groupPrincipal.Members.Contains(pc, IdentityType.SamAccountName, u.SamAccountName)) //error occurs here
        {
            return;
        }
        groupPrincipal.Members.Add(u);
        try
        {
            groupPrincipal.Save();
        }
        catch (Exception e)
        {
        }
    }

Это работало с сегодняшнего утра, создание пользователя всегда успешно, но я получаю эту ошибку в строке:

  • if (groupPrincipal.Members.Contains(pc, IdentityType.SamAccountName, u.SamAccountName))

Произошла ошибка (1332) при перечислении членства в группе. SID участника не может быть разрешен.

Спасибо за ваши ответы


person adun    schedule 08.07.2010    source источник


Ответы (1)


Не уверен, что это поможет, но согласно этому отчету на Microsoft Connect, это может быть связано:

Текущий выпуск перечисления группы System.DirectoryServices.AccountManagement требует, чтобы все объекты в группе были доступны, иначе будет создано исключение. Вы видите объект, указанный в локальной группе, которого больше нет в ActiveDirectory. Поскольку система не удалит эти ссылки автоматически, каждый раз, когда эта группа будет перечисляться, произойдет сбой. Чтобы предотвратить этот сбой, удалите ссылку на объект в ActiveDirectory, который больше не существует. Мы изучаем возможность внесения изменений в API в будущем выпуске, которые упростят работу с подобными сценариями.

person Matthew Abbott    schedule 08.07.2010
comment
Спасибо, Мэтт, возможно, ты прав, я не могу понять другое происхождение. Согласно MS, есть способ исправить это: удаление (с помощью графического интерфейса) плохого SID из группы решает проблему. Любая идея, как определить плохой SID? - person adun; 08.07.2010