ПАРОЛЬ_CANT_CHANGE для Delphi IPWorks LDAP

Я использую компонент LDAP Delphi 10.3 и IPWorks. Я могу без проблем изменять большинство атрибутов, напримерunicodePwd, givenName, а также mail. Однако дляuserAccountControl атрибут пользователя, я не могу установить ADS_UF_PASSWD_CANT_CHANGE, конечно, после успешного связывания в качестве администратора с безопасным соединением и предоставления правильного DN, потому что, если соединение небезопасно, невозможно изменить пароль:

const
  ADS_UF_NORMAL_ACCOUNT = 512;
  ADS_UF_DONT_EXPIRE_PASSWD = 65536;
  ADS_UF_PASSWD_CANT_CHANGE = 64;
  ADS_UF_LOCKOUT = 16;

ipaLDAP1.DN := searchResultDN;
ipaLDAP1.AttrCount := 1;
ipaLDAP1.AttrType[0] := 'userAccountControl';
ipaLDAP1.AttrValue[0] := IntToStr(ADS_UF_NORMAL_ACCOUNT + ADS_UF_DONT_EXPIRE_PASSWD + ADS_UF_LOCKOUT + ADS_UF_PASSWD_CANT_CHANGE);
ipaLDAP1.AttrModOp[0] := amoReplace;

ipaLDAP1.Modify();

Странно, что не могу доработать ADS_UF_PASSWD_CANT_CHANGE. На пользователя это не влияет. Когда я проверяю пользователя, этот атрибут все еще не установлен. Не понимаю почему.

1 ответ

userAccountControl это битовая маска, поэтому вы должны использовать or оператор для объединения флагов, а не + оператор.

Но, что более важно, в соответствии с тем, как использовать флаги UserAccountControl для управления свойствами учетной записи пользователя:

PASSWD_CANT_CHANGE
Примечание. Вы не можете назначить это разрешение, напрямую изменив атрибут UserAccountControl. Для получения информации о том, как установить разрешение программным способом, см. Раздел "Описание флагов свойств".

Где в разделе "Описание флагов свойств" сказано:

Эта страница, в свою очередь, говорит:

Возможность пользователя изменять свой собственный пароль - это разрешение, которое может быть предоставлено или отклонено. Чтобы запретить это разрешение, установите два ACE в списке управления дискреционным доступом дескриптора безопасности (DACL) пользовательского объекта с типом ADS_ACETYPE_ACCESS_DENIED_OBJECT ace. Один ACE отказывает в разрешении пользователю, а другой ACE отрицает разрешение для группы "Все". Оба ACE являются объектно-зависимыми запрещающими ACE, которые определяют GUID расширенного разрешения на изменение паролей. Чтобы предоставить это разрешение, установите те же ACE с типом ace ADS_ACETYPE_ACCESS_ALLOWED_OBJECT.

Следующая процедура описывает, как изменить или добавить ACE для этого разрешения.

Чтобы изменить или добавить ACE для этого разрешения

  1. Привязать к объекту пользователя.

  2. Получить IADsSecurityDescriptor объект из ntSecurityDescriptor свойство пользовательского объекта.

  3. Получить IADsAccessControlList интерфейс для дескриптора безопасности из IADsSecurityDescriptor.DiscretionaryAcl свойство.

  4. Перечислите ACE для объекта и найдите ACE, которые имеют GUID смены пароля ({AB721A53-1E2F-11D0-9819-00AA0040529B}) для IADsAccessControlEntry.ObjectType свойство и "Все" или "NT AUTHORITY\SELF" для IADsAccessControlEntry.Trustee свойство.

    Примечание. Строки "Все" и "NT AUTHORITY\SELF" локализованы на основе языка первого контроллера домена в домене. По этой причине нельзя использовать строки напрямую. Имена учетных записей должны быть получены во время выполнения, вызвавLookupAccountSidфункция с SID для "Все" ("S-1-1-0") и "NT AUTHORITY\SELF" ("S-1-5-10") хорошо известных участников безопасности. ВGetSidAccountName, GetSidAccountName_Everyone, а также GetSidAccountName_SelfПримеры функций C++, показанные в разделе "Чтение того, что пользователь не может изменить пароль (поставщик LDAP)" демонстрируют, как это сделать.

  5. Измените IADsAccessControlEntry.AceType собственности ACE, которые были обнаружены ADS_ACETYPE_ACCESS_DENIED_OBJECT если пользователь не может изменить свой пароль или ADS_ACETYPE_ACCESS_ALLOWED_OBJECT если пользователь может изменить свой пароль.

  6. Если ACE "Все" не найден, создайте новый IADsAccessControlEntry объект, который содержит значения свойств, показанные в таблице ниже, и добавить новую запись в ACL с IADsAccessControlList.AddAce метод.

  7. Если ACE "NT AUTHORITY\SELF" не найден, создайте новый IADsAccessControlEntryобъект с такими же значениями свойств, как показано в таблице ниже, за исключением того, что свойство Trustee содержит имя учетной записи для SID "S-1-5-10" ("NT AUTHORITY\SELF"). Добавьте запись в ACL сIADsAccessControlList.AddAce метод.

  8. Чтобы обновить ntSecurityDescriptor свойство объекта, вызовите IADs.Put метод с тем же IADsSecurityDescriptor полученный на шаге 2.

  9. Зафиксируйте локальные изменения на сервере с помощью IADs.SetInfo метод.

  10. Если какой-либо из ACE был создан, необходимо изменить порядок ACL, чтобы ACE располагались в правильном порядке. Для этого позвоните вGetNamedSecurityInfo функция с LDAP ADsPath объекта, а затем SetNamedSecurityInfoработать с тем же DACL. Это изменение порядка будет происходить автоматически при добавлении ACE.

В следующей таблице перечислены IADsAccessControlEntry значения свойств объекта.

AccessMask
ADS_RIGHT_DS_CONTROL_ACCESS

AceType
ADS_ACETYPE_ACCESS_DENIED_OBJECT если пользователь не может изменить свой пароль или ADS_ACETYPE_ACCESS_ALLOWED_OBJECT если пользователь может изменить свой пароль.

AceFlags
0

Flags
ADS_FLAG_OBJECT_TYPE_PRESENT

ObjectType
"{AB721A53-1E2F-11D0-9819-00AA0040529B}", который представляет собой GUID смены пароля в строковой форме.

InheritedObjectType
Не используется

Trustee
Имя учетной записи для SID "S-1-1-0" (Все).

На той же странице представлен довольно длинный пример кода.

Другие вопросы по тегам