Похоже, не удается добавить пользователя в группу безопасности AD с помощью флажка в Windows forms

#c# #.net #windows-forms-designer

Вопрос:

Я не могу заставить часть моей формы Windows функционировать. Я не знаю, где я ошибся, потому что многие другие источники говорили, что таким образом можно добавлять пользователей в группы. Я получаю эту ошибку каждый раз:

Система.Время выполнения.Взаимодействия.Исключение COMException: «Неопределенная ошибка»

Он терпит неудачу на этой линии здесь: de.Properties["member"].Add(up);

Но я не могу понять, почему он терпит неудачу. Я также безуспешно string group = chklbADGroups.CheckedItems пытался, поэтому вместо этого я попытался указать имя группы.

         foreach (string item in chklbADGroups.Items)
        {
            string group = "CN=mygroup";
            bool isChecked = chklbADGroups.GetItemChecked(chklbADGroups.FindStringExact(item));
            string LDAP = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
            PrincipalContext ouContext = new PrincipalContext(ContextType.Domain, LDAP);
            WindowsIdentity.GetCurrent();
            SearchResult results;
            DirectorySearcher ds = null;
            DirectoryEntry de = new
            DirectoryEntry(ouContext   group);
            
            UserPrincipal up = new UserPrincipal(ouContext);

            if (de != null amp;amp; isChecked == true)
            {
          
                de.Properties["member"].Add(up);
                de.CommitChanges();
                de.Close();
            }
        }
 

Ответ №1:

Так что я действительно все понял. Я обошел это, используя другой метод. Вместо использования цикла foreach, который проходил через каждый элемент, отмеченный в контрольном списке. (Я продолжал получать сообщение об ошибке, что список изменился и его нельзя было просмотреть во второй раз.) Я использовал цикл foreach, который перебирает все проверенные элементы, а затем помещает их в строки и помещает в список. Затем я использовал foreach, который проходит по этому списку (который не меняется), получает строки из списка и передает их участнику группы через переменную GroupName.

             var checkedItems = new List<string>();
            foreach (var chk in chklbADGroups.CheckedItems)
            {
                checkedItems.Add(chk.ToString());
            }
            foreach (string GroupName in checkedItems)
            {
                
                    WindowsIdentity.GetCurrent();
                    string username = up.SamAccountName;
                    MessageBox.Show(GroupName);
                    PrincipalContext context = new PrincipalContext(ContextType.Domain, DomainName);
                    GroupPrincipal grp = GroupPrincipal.FindByIdentity(context, IdentityType.Name, GroupName);
                    if (GroupName != null)
                    {
                        grp.Members.Add(context, IdentityType.SamAccountName, username);
                        grp.Save();
                        grp.Dispose();
                        context.Dispose();
                    }
            }