ПАРОЛЬ_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. Для получения информации о том, как установить разрешение программным способом, см. Раздел "Описание флагов свойств".
Где в разделе "Описание флагов свойств" сказано:
PASSWD_CANT_CHANGE - Пользователь не может изменить пароль. Это разрешение на объект пользователя. Для получения информации о том, как программно установить это разрешение, посетите следующий веб-сайт:
Изменение пользователя не может изменить пароль (поставщик LDAP)
Эта страница, в свою очередь, говорит:
Возможность пользователя изменять свой собственный пароль - это разрешение, которое может быть предоставлено или отклонено. Чтобы запретить это разрешение, установите два ACE в списке управления дискреционным доступом дескриптора безопасности (DACL) пользовательского объекта с типом ADS_ACETYPE_ACCESS_DENIED_OBJECT ace. Один ACE отказывает в разрешении пользователю, а другой ACE отрицает разрешение для группы "Все". Оба ACE являются объектно-зависимыми запрещающими ACE, которые определяют GUID расширенного разрешения на изменение паролей. Чтобы предоставить это разрешение, установите те же ACE с типом ace ADS_ACETYPE_ACCESS_ALLOWED_OBJECT.
Следующая процедура описывает, как изменить или добавить ACE для этого разрешения.
Чтобы изменить или добавить ACE для этого разрешения
Привязать к объекту пользователя.
Получить
IADsSecurityDescriptor
объект изntSecurityDescriptor
свойство пользовательского объекта.Получить
IADsAccessControlList
интерфейс для дескриптора безопасности изIADsSecurityDescriptor.DiscretionaryAcl
свойство.Перечислите 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)" демонстрируют, как это сделать.Измените
IADsAccessControlEntry.AceType
собственности ACE, которые были обнаруженыADS_ACETYPE_ACCESS_DENIED_OBJECT
если пользователь не может изменить свой пароль илиADS_ACETYPE_ACCESS_ALLOWED_OBJECT
если пользователь может изменить свой пароль.Если ACE "Все" не найден, создайте новый
IADsAccessControlEntry
объект, который содержит значения свойств, показанные в таблице ниже, и добавить новую запись в ACL сIADsAccessControlList.AddAce
метод.Если ACE "NT AUTHORITY\SELF" не найден, создайте новый
IADsAccessControlEntry
объект с такими же значениями свойств, как показано в таблице ниже, за исключением того, что свойство Trustee содержит имя учетной записи для SID "S-1-5-10" ("NT AUTHORITY\SELF"). Добавьте запись в ACL сIADsAccessControlList.AddAce
метод.Чтобы обновить
ntSecurityDescriptor
свойство объекта, вызовитеIADs.Put
метод с тем жеIADsSecurityDescriptor
полученный на шаге 2.Зафиксируйте локальные изменения на сервере с помощью
IADs.SetInfo
метод.Если какой-либо из 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" (Все).
На той же странице представлен довольно длинный пример кода.