Досить часто системного адміністратора Windows доводиться робити різні вивантаження за інформацією про користувачів домену Active Directory. Уявімо, що у нас є список облікових записів (імена користувача в форматі samAccountName), і нам, наприклад, необхідно отримати інформацію про те, в якій організації ці користувачі працюють і їх Canonical Name (CN). Раніше для отримання такої інформації мені доводилося писати невеликий скрипт на vbs, який послідовно перебирає всі записи в Excel і повертає назад необхідну інформацію з Active Directory. Такий механізм повністю працездатний, але не дуже зручний, тому я вирішив скористатися міццю мови Visual Basic from Application і виконувати запити до Active Directory прямо з Excel (З макросу), тому що така методика була б досить універсальною і в принципі всі ці скрипти можна зі спокійною совістю передавати менш підкованим бухгалтерам та економістам!

Я створив новий макрос в книзі Excel, і створив функцію з ім’ям GetADInfo, яка на вході отримує ім’я поля, по якому здійснюється пошук (в моєму випадку це ім’я користувача, яке зберігається в атрибуті Active Directory – samAccountName), значення цього поля (значення осередки з ім’ям користувача) і ім’я артібута AD, значення якого функція повинна повернути.

Виконуємо запит до Active Directory з книги Excel

Як же все це працює? У моєму прикладі в осередку A2 міститься ім’я користувача домену, і я хочу для цього користувача дізнатися компанію, в якій він числиться (поле AD “Company”) і його канонічне ім’я (поле AD «distinguishedName»), в цьому випадку формули для осередків відповідно будуть виглядати наступним чином:

Осередок B2 (найменування організації):

=GetADInfo("samAccountName";A2; "Company")

Осередок C2 (CN):

=GetADInfo("samAccountName";A2; "distinguishedName")

Код макросу на VBA для отримання даних з AD наступний:

Function GetADInfo(ByVal SearchField, ByVal SearchString, ByVal ReturnField)

' Указываем  имя домена ("dc=domain, dc=local")

Dim adoCommand, strDomain, objConnection

strDomain = "dc=winitpro,dc=ru"

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"

' Подключаемся

Set adoCommand = CreateObject("ADODB.Command")

adoCommand.ActiveConnection = objConnection

' Рекурсивный поиск по AD, начиная с корня домена

adoCommand.CommandText = _
 "<LDAP://" & strDomain & ">;(&(objectCategory=" & "User" & ")" & _
 "(" & SearchField & "=" & SearchString & "));" & SearchField & "," & ReturnField & ";subtree"

' создаем набор записей RecordSet

Dim objRecordSet

Set objRecordSet = adoCommand.Execute

If objRecordSet.RecordCount = 0 Then

GetADInfo = "not found"  ' ничего не найдено

Else

GetADInfo = objRecordSet.Fields(ReturnField) ' возвращаемое значение

End If

' Закрываем подключение

objConnection.Close

' Очищаем переменные

Set objRecordSet = Nothing

Set objCommand = Nothing

Set objConnection = Nothing

End Function

Щоб дана функція запрацювала, необхідно підключити ряд бібліотек в VBA. У редакторі VBA вибираємо меню Tools-> References і у вікні відзначаємо такі бібліотеки:

Бібліотеки для виконання запитів до active directory з vba

  • Visual Basic для застосування
  • Бібліотека об’єктів Microsoft Excel 14.0
  • Автоматизація OLE
  • Бібліотека об’єктів Microsoft Office 14.0
  • Microsoft ActiveX Data Objects 2.8 Library (або близько того)
  • Виконання сценаріїв Microsoft
  • Регулярні вирази Microsoft VBScript 5.5

Після того, як ви активуєте наступні компоненти, збережіть макрос VBAі книгу Excel, і в результаті у відповідних полях Excel з’явиться інформація з Active Directory. Красу даного скрипта полягає в тому, що він досить універсальний і з невеликими модифікаціями він допоможе динамічно отримувати практично будь-яку інформацію з Active Directory прямо в книзі прямо в книзі Excel!

Leave a Reply

Your email address will not be published. Required fields are marked *