Выбор атрибута AD ntSecurityDescriptor как Non-Admin

Я работаю над парсером дескриптора SDDL / Security для ACL / ACE Active Directory. Я почти готов, все работает нормально, когда я подключаюсь к LDAP с использованием учетной записи администратора.

Однако, когда я пытаюсь запросить ntSecurityDescriptor как неадминистративную учетную запись, он не возвращает никаких значений. У пользователя есть права на чтение атрибута. Когда я начал исследовать это, я наткнулся на следующий серверный сервер LDAP:

https://msdn.microsoft.com/en-us/library/cc223323.aspx

Элемент LDAP_SERVER_SD_FLAGS_OID используется с запросом поиска LDAP для управления частью дескриптора безопасности Windows для извлечения. DC возвращает только указанную часть дескрипторов безопасности. Он также используется с запросами LDAP Add и Modify для управления частью дескриптора безопасности Windows для изменения. DC изменяет только указанную часть дескриптора безопасности.

При отправке этого элемента управления в DC, поле controlValue устанавливается на BER-кодирование следующей структуры ASN.1.

  SDFlagsRequestValue ::= SEQUENCE { Flags INTEGER } 

Значение Flags имеет следующий формат, представленный в байтовом порядке байтов. X обозначает неиспользуемые биты, которые ДОЛЖНЫ быть установлены клиентом на 0 и которые ДОЛЖНЫ быть проигнорированы сервером.

Указание флагов без установленных битов или без использования элемента управления LDAP_SERVER_SD_FLAGS_OID эквивалентно установке флажков в (OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION). Отправка этого элемента управления в DC не приводит к тому, что сервер будет включать любые элементы управления в свой ответ.

Последняя часть этого документа из документов не представляется правильной, по крайней мере, не в контексте неадминистративного пользователя.

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

 $user = 'user@example.local'; $pass = 'secret'; $server = 'dc1.example.local'; $ldap = ldap_connect($server); ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); ldap_bind($ldap, $user, $pass); $ctrl1 = array( "oid" => "1.2.840.113556.1.4.801", "iscritical" => true, // How should this value be set??? "value" => sprintf("%c%c%c%c%c", 48, 3, 2, 1, 15) ); if (!ldap_set_option($ldap, LDAP_OPT_SERVER_CONTROLS, array($ctrl1))) { echo "Failed to set server controls"; } $searchUser = "user"; $dn = "dc=example,dc=local"; $filter="(sAMAccountName=$searchUser)"; $attr = array("ntsecuritydescriptor"); $sr = ldap_search($ldap, $dn, $filter, $attr); $info = ldap_get_entries($ldap, $sr); // Should contain ntSecurityDescriptor...but it does not. var_dump($info); 

Я знаю, что значение для элемента управления должно быть закодировано BER, но я не уверен, как достичь этого для значения, как оно определено в документах. Мне удалось найти следующий пример Java:

https://github.com/Tirasa/ADSDDL/blob/master/src/main/java/net/tirasa/adsddl/ntsd/controls/SDFlagsControl.java

Но я не смог перевести то, что происходит на PHP. Есть идеи?

Related of "Выбор атрибута AD ntSecurityDescriptor как Non-Admin"