Досить часто системного адміністратора 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 = _ "; (& (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 For Application
- Microsoft Excel 14.0 Object Library
- OLE Automation
- Microsoft Office 14.0 Object Library
- Microsoft ActiveX Data Objects 2.8 Library (або близько того)
- Microsoft Scripting Runtime
- Microsoft VBScript Regular Expressions 5.5
Після того, як ви активуєте наступні компоненти, збережіть макрос VBAі книгу Excel, і в результаті у відповідних полях Excel з'явиться інформація з Active Directory. Красу даного скрипта полягає в тому, що він досить універсальний і з невеликими модифікаціями він допоможе динамічно отримувати практично будь-яку інформацію з Active Directory прямо в книзі прямо в книзі Excel!