Установка прав доступа для объекта

При использовании com-объектов ADSI IADsSecurityDescriptor (дескриптор безопасности), IADsAccessControlList (DACLs и SACLs) и IADsAccessControlEntry (ACE) для добавления ACE в ACL вы вносите изменения в свойство nTSecurityDescriptor указанного объекта в кэше свойств. Это означает, что для записи обновленного дескриптора безопасности в каталог из кэша свойств необходимо вызвать методы, содержащие новый ACE и метод IADs.SetInfo.

Дополнительные сведения и пример кода, который задает ACE для объекта в службах домен Active Directory, см. в примере кода для задания ACE в объекте каталога.

Используйте следующий общий процесс, чтобы создать ACE для права доступа и задать ACE в DACL объекта.

  1. Получите указатель интерфейса IADs на объект.

  2. Используйте метод IADs.Get, чтобы получить дескриптор безопасности объекта. Имя свойства, содержащего дескриптор безопасности, — nTSecurityDescriptor. Свойство будет возвращено в виде VARIANT, содержащего указатель IDispatch (элемент vt является VT_DISPATCH). Вызовите запросInterface на этот указатель IDispatch, чтобы получить интерфейс IADsSecurityDescriptor, чтобы использовать методы в этом интерфейсе для доступа к ACL дескриптора безопасности.

  3. Используйте свойство IADsSecurityDescriptor.DiscretionaryAcl, чтобы получить DACL. Метод возвращает указатель IDispatch. Вызовите указатель QueryInterface на этот указатель IDispatch, чтобы получить интерфейс IADsAccessControlList, чтобы использовать методы в этом интерфейсе для доступа к отдельным acEs в ACL.

  4. Используйте CoCreateInstance, чтобы создать com-объект ADSI для нового ACE и получить указатель интерфейса IADsAccessControlEntry на этот объект. Помните, что идентификатор класса CLSID_AccessControlEntry.

  5. Задайте свойства ACE с помощью методов IADsAccessControlEntry:

    1. Используйте IADsAccessControlEntry::p ut_Trustee, чтобы задать доверенному лицу , которому применяется этот ACE. Доверенное лицо является пользователем, группой или другим субъектом безопасности. Приложение должно использовать значение из соответствующего свойства от пользователя или группы объекта доверенного лица, к которому вы хотите применить ACE. Доверенное лицо указывается как BSTR и может принимать следующие формы:
      • Учетная запись домена (имя входа, используемое в предыдущей версии Windows NT) формы "домен\учетная запись> пользователя", где< "домен>" — это имя домена Windows NT, содержащего пользователя и "<учетную запись> пользователя" — свойство sAMAccountName указанного пользователя.<>< Например: fabrikam\jeffsmith.
      • Известный субъект безопасности, представляющий специальные удостоверения, определенные системой безопасности Windows NT, например все, локальная система, субъект самозаверяющий, прошедший проверку подлинности пользователь, владелец создателя и т. д. Объекты, представляющие известные субъекты безопасности, хранятся в контейнере известных субъектов безопасности под контейнером конфигурации. Например, анонимный вход.
      • Встроенная группа, представляющая встроенные группы пользователей, определенные системой безопасности Windows NT. Он имеет форму "BUILDIN\<group name>", где< "имя> группы" — это имя встроенной группы пользователей. Объекты, представляющие встроенные группы, хранятся в контейнере Builtin под контейнером домена. Например, "BUILDIN\Администратор istrator".
      • ИДЕНТИФИКАТОР (строковый формат) указанного пользователя, являющегося свойством objectSID указанного пользователя. Вы можете преобразовать в строковую форму с помощью функции ConvertSidToStringSid в API безопасности Win32. Например: "S-1-5-32-548".
    2. Используйте свойство IADsAccessControlEntry.AccessMask, чтобы задать маску, указывающую право доступа. Перечисление ADS_RIGHTS_ENUM указывает права доступа, которые можно задать в объекте каталога.
    3. Используйте свойство IADsAccessControlEntry.AceType, чтобы указать, следует ли разрешать или запрещать права доступа, заданные AccessMask. Для стандартных прав это может быть ADS_ACETYPE_ACCESS_ALLOWED или ADS_ACETYPE_ACCESS_DENIED. Для прав конкретного объекта (прав, которые применяются к определенной части объекта или определенному типу объекта), используйте ADS_ACETYPE_ACCESS_ALLOWED_OBJECT или ADS_ACETYPE_ACCESS_DENIED_OBJECT. Перечисление ADS_ACETYPE_ENUM указывает типы доступа, которые можно задать в ACE.
    4. Используйте свойство IADsAccessControlEntry.AceFlags, чтобы указать, могут ли другие контейнеры или объекты под указанным объектом наследовать ACE. Перечисление ADS_ACEFLAG_ENUM указывает флаги наследования, которые можно задать в ACE.
    5. Используйте свойство IADsAccessControlEntry.Flags, чтобы указать, применяется ли право к определенной части объекта, наследуемого типа объекта или обоих.
    6. Если флаги заданы для ADS_FLAG_OBJECT_TYPE_PRESENT, задайте свойство IADsAccessControlEntry.ObjectType, указав строку, содержащую GUID класса объектов (для ADS_RIGHT_DS_CREATE_CHILD или ADS_RIGHT_DS_DELETE_CHILD), свойства, набора свойств, проверенной записи или расширенного права, к которому применяется ACE. GUID должен быть указан в виде строки формы, созданной функцией StringFromGUID2 в библиотеке COM.
    7. Если для флагов задано значение ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT, задайте свойство IADsAccessControlEntry.InheritedObjectType , чтобы указать строку, содержащую GUID унаследованного класса объектов, к которому применяется ACE. GUID должен быть указан в виде строки формы, созданной функцией StringFromGUID2 в библиотеке COM.
  6. Используйте метод QueryInterface в объекте IADsAccessControlEntry, чтобы получить указатель IDispatch. Для метода IADsAccessControlList.AddAce требуется указатель интерфейса IDispatch на ACE.

  7. Используйте IADsAccessControlList.AddAce, чтобы добавить новый ACE в DACL. Помните, что порядок ACES в ACL может повлиять на оценку доступа к объекту. Для правильного доступа к объекту может потребоваться создать ACL, добавить ACL из существующего ACL в правильном порядке в новый ACL, а затем заменить существующий ACL в дескрипторе безопасности новым ACL. Дополнительные сведения см. в разделе "Порядок acES" в DACL.

  8. Используйте свойство IADsSecurityDescriptor.DiscretionaryAcl для записи DACL, содержащего новый ACE в дескриптор безопасности. Дополнительные сведения о DACLs см. в разделе Null DACLs и пустых списков DACLs.

  9. Используйте метод IADs.Put для записи дескриптора безопасности в свойство nTSecurityDescriptor объекта в кэш свойств.

  10. Используйте метод IADs.SetInfo, чтобы обновить свойство объекта в каталоге.