Что нового

LDAP запросы в Active Diretory

ildar

Осваивающий
Сообщения
252
Репутация
30
Сразу скажу что это не мое, где то нашел здесь на форуме, подправил под себя и пользуюсь
Код:
Local $aResult[1000][7] ; Итоговый массив
$i=1
	$sContainer = 'путь до контейнера'
	$oContainer = ObjGet('LDAP://'&$sContainer)        ; Получить ссылку на объект
	; Фильтр, чтобы уменьшить объём возвращаемых данных и увеличить производительность
	Local $avArray[1] = ["User"]                                    ;"User" "Computer" "Group" "LocalGroup" "GlobalGroup" "OrganizationalUnit"
	$oContainer.Filter =$avArray
	For $objItem  In $oContainer
		$aResult[$i][0]=$objItem.company                            ; Организация
		$aResult[$i][1]=StringTrimLeft($objItem.Name,3)             ; ФИО
		$aResult[$i][2]=$objItem.mobile                         ; Телефон
		$i+=1
	Next
ReDim $aResult[$i][3]
	_ArrayDisplay($aResult)
Скрипт выдает список пользователей находящихся в контейнере указанной в переменной
Код:
$sContainer
можно ли вывести список всех пользователей указав только верхушку архитектуры каталога?

Нашел тут некоторое описаниеhttp://www.script-coding.com/Python/LDAP.html но это python, я его не знаю.
Пример запроса на диалекте LDAP:
<LDAP://DC=domainName,DC=ru>;(objectClass=*);AdsPath, cn;subTree
Первая часть запроса - базовое отличительное имя (base distinguished name) - использует синтаксис вида <LDAP://отличительное_имя>. Отличительное имя должно принадлежать контейнерному объекту, в котором производится поиск (обычно домену, сайту или организационному подразделению).
Вторая часть запроса (в примере - (objectClass=*)) является поисковым фильтром LDAP. В примере фильтр означает "искать любые объекты".
Третья часть запроса (в примере - AdsPath, cn) является набором атрибутов (столбцов), которые будут возвращаться в ходе выполнения запроса. Если необходимо вернуть несколько атрибутов для объекта, наименования атрибутов должны быть разделены запятыми.
Четвертая часть запроса (в примере - subTree) задаёт диапазон поиска. Возможные значения:
base - поиск производится только по одному объекту, указанному в первой части запроса. Всегда возвращается либо один объект, либо пустой набор объектов. По сути это проверка существования объекта;
onelevel - поиск производится только по непосредственным дочерним объектам контейнерного объекта, указанного в первой части запроса. Поиск по вложенным объектам более низких уровней производится не будет. В поиск не попадёт и сам контейнерный объект;
subtree - поиск будет производиться по всем объектам вниз по иерархии - глубокий поиск (deep search). В поиск при этом не попадает сам контейнерный объект.
subtree этот параметр меня интересует, но как его тут применить не понимаю.
 
Автор
ildar

ildar

Осваивающий
Сообщения
252
Репутация
30
Я так понимаю, задача не разрешимая. Сделал так, в ini-файле сохранил нужные контейнеры ввиде
Код:
[AD]
uo="uo=sklad,dc=company,dc=ru"
uo="uo=office,dc=company,dc=ru"
и так далее...
ну и сам код
Код:
Dim $oContainer
Dim $oUser,$objItem,$oContainerFilter

$aArray = IniReadSection(@ScriptDir & "\AD_tel.ini", "AD")										; Массив контейнеров для выгрузки
If @error Then
    MsgBox(4096, "", "Произошла ошибка, возможно отсутствует INI-файл.")
	Exit
Else
EndIf

Local $aResult[1000][7] ; Итоговый массив
$i=1
For $j =1 to $aArray[0][0]
	$sContainer = $aArray[$j][1]
	$oContainer = ObjGet('LDAP://'&$sContainer) ; Получить ссылку на объект
	; Фильтр, чтобы уменьшить объём возвращаемых данных и увеличить производительность
	Local $avArray[1] = ["User"]                                    ;"User" "Computer" "Group" "LocalGroup" "GlobalGroup" "OrganizationalUnit"
	$oContainer.Filter =$avArray
	For $objItem  In $oContainer
		$aResult[$i][0]=$objItem.company                            ; Организация
		$aResult[$i][1]=StringTrimLeft($objItem.Name,3)             ; ФИО
		$aResult[$i][2]=$objItem.mobile                         ; Табельный номер
		$i+=1
	Next
Next
ReDim $aResult[$i][3]
	_ArrayDisplay($aResult)
 
Верх