Досить часто системного адміністратора Windows доводиться робити різні вивантаження за інформацією про користувачів домену Active Directory. Уявімо, що у нас є список облікових записів (імена користувача в форматі samAccountName), і нам, наприклад, необхідно отримати інформацію про те, в якій організації ці користувачі працюють і їх Canonical Name (CN). Раніше для отримання такої інформації мені доводилося писати невеликий скрипт на vbs, який послідовно перебирає всі записи в Excel і повертає назад необхідну інформацію з Active Directory. Такий механізм повністю працездатний, але не дуже зручний, тому я вирішив скористатися міццю мови Visual Basic from Application і виконувати запити до Active Directory прямо з Excel (З макросу), тому що така методика була б досить універсальною і в принципі всі ці скрипти можна зі спокійною совістю передавати менш підкованим бухгалтерам та економістам!
Я створив новий макрос в книзі Excel, і створив функцію з ім’ям GetADInfo, яка на вході отримує ім’я поля, по якому здійснюється пошук (в моєму випадку це ім’я користувача, яке зберігається в атрибуті Active Directory – samAccountName), значення цього поля (значення осередки з ім’ям користувача) і ім’я артібута AD, значення якого функція повинна повернути.
Як же все це працює? У моєму прикладі в осередку 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 і у вікні відзначаємо такі бібліотеки:
- 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!