none
DACL для Organizational Unit. Добавить правило ACE. RRS feed

  • Вопрос

  • Всем приветствия. Продолжаются мои запары с Active Directory.

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

    Написал следующий код:

    public static void AddReadingAceForGroup(DirectoryEntry dirEntry, string groupName)
            {
                dirEntry.RefreshCache();
                DirectoryEntry root = new DirectoryEntry("LDAP://192.168.1.1/dc=mydomain,dc=ru");
                using (DirectorySearcher ds = new DirectorySearcher(root, "CN="+groupName))
                {
                    SearchResult sr = ds.FindOne();
                    root = sr.GetDirectoryEntry();
                }
                try
                {
                    ActiveDirectoryAccessRule accessRule =
                        new ActiveDirectoryAccessRule(root.ObjectSecurity.GetGroup(typeof(SecurityIdentifier)),
                                                      ActiveDirectoryRights.GenericRead, AccessControlType.Allow);
                    dirEntry.ObjectSecurity.AddAccessRule(accessRule);
                    dirEntry.CommitChanges();
                }
                catch(Exception e)
                {
                }
            }

    Перед выполнением это кода выполняется олицетворение пользователя учеткой на удаленном сервере(точно таким же образом вызываю функцию удаления определенных пермишенов и она работает!), после чего в данную функцию передается объект DirectoryEntry соответствующий тому OU(Organizational Unit), для которого я хочу поменять разрешения, а также groupName - имя группы которой я хочу дать разрешения на общее чтение данного OU. Код выполняется без ошибок, но вот новое правило ACL почему то не появляется. Помогите разобраться, где ошибка.

     



    • Изменено Джоник 31 января 2012 г. 13:00
    31 января 2012 г. 12:58

Ответы

  • Понял свою ошибку.

    Я не верно понял результат метода DirectoryEntry.ObjectSecurity.GetGroup(). В итоге по-другому получил SecurityIdentifier для группы и все реализовалось как надо. Да в таком варианте код тоже работает, но делает немного другое, т.е. GetGroup возвращал мне идентификатор группы являющейся владельцем группы groupName, а мне надо было немного другое.

    public static void AddReadingAceForGroup(DirectoryEntry dirEntry, SecurityIdentifier groupSecId)
    {
      try
      {
        ActiveDirectoryAccessRule accessRule = new ActiveDirectoryAccessRule(groupSecId,ActiveDirectoryRights.GenericRead, AccessControlType.Allow);
        dirEntry.ObjectSecurity.AddAccessRule(accessRule);
        dirEntry.CommitChanges();
      }
      catch(Exception e)
      {
      }
    }
    

    • Помечено в качестве ответа Abolmasov Dmitry 2 февраля 2012 г. 7:59
    1 февраля 2012 г. 11:50