Доста често системният администратор на Windows трябва да прави различни качвания въз основа на информация за потребителите в домейн в Active Directory. Представете си, че имаме списък с акаунти (потребителски имена във формат samAccountName) и например трябва да получим информация за организацията, в която работят тези потребители, и тяхното Canonical Name (CN). По-рано, за да получа такава информация, трябваше да напиша малък скрипт в vbs, който последователно повтаря всички записи в Excel и връща обратно нужната информация от Active Directory. Такъв механизъм е напълно функционален, но не е много удобен, затова реших да използвам силата на Visual Basic от езика на приложението и да изпълня Active Directory запитва директно от Excel (от макроса), защото подобна техника би била доста универсална и по принцип всички тези скриптове могат да бъдат прехвърлени с чиста съвест на по-слабо разбираемите счетоводители и икономисти!
Създадох нов макрос в работна книга на Excel и създадох функция, наречена GetADInfo, която при входа получава името на търсеното поле (в моя случай това е потребителското име, съхранявано в атрибута Active Directory - samAccountName), стойността на това поле (стойност на клетката с потребителско име) и името на артилера AD, чиято стойност функцията трябва да върне.
Как работи всичко това? В моя пример клетка A2 съдържа името на потребителя на домейна и искам този потребител да разбере компанията, в която е вписан (поле AD „Company“) и каноничното му име (поле AD „unknownName“), в този случай формулите за клетките, съответно ще изглежда така:
Клетка B2 (наименование на организацията):
= GetADInfo ("samAccountName"; A2; "Компания")
Клетка C2 (CN):
= GetADInfo ("samAccountName"; A2; "отличенName")
VBA макро кодът за извличане на данни от AD е както следва:
Функция GetADInfo (ByVal SearchField, ByVal SearchString, ByVal ReturnField) 'Посочете името на домейна ("dc = домейн, dc = local") Dim adoCommand, strDomain, objConnection strDomain = "dc = winitpro, dc = ru" Задайте objConnection = CreateObject ( ADODB.Connection ") objConnection.Open" Provider = ADsDSOObject; " 'Свързване на набор adoCommand = CreateObject ("ADODB.Command") adoCommand.ActiveConnection = objConnection' Рекурсивно търсене в AD, започващо от корен на домейна adoCommand.CommandText = _ "; (& (objectCategory =" & "Потребител" & ")" & _ "(" & SearchField & "=" & SearchString & "));" & SearchField & "," & ReturnField & "; subtree" "създадете набор от записи RecordSet Dim objRecordSet Set objRecordSet = adoCommand.Execute Ако objRecordSet.RecordCount = 0 Тогава GetADInfo =" не е намерено "'нищо не е намерено иначе GetADInfo = objRecordS ReturnField) 'връща стойност End Ако' Затворете връзката objConnection.Close 'Изчистване на променливите Задайте objRecordSet = Нищо не е зададено objCommand = Нищо Не е определено objConnection = Нищо Крайна функция
За да работи тази функция, трябва да свържете няколко библиотеки във VBA. В редактора на VBA изберете менюто Инструменти-> Референции и в прозореца, който се показва, маркирайте следните библиотеки:
- Visual basic за приложение
- Обектна библиотека на Microsoft Excel 14.0
- OLE автоматизация
- Обектна библиотека на Microsoft Office 14.0
- Microsoft ActiveX Data Objects 2.8 библиотека (или толкова)
- Microsoft Scripting Runtime
- Регулярни изрази на Microsoft VBScript 5.5
След като активирате следните компоненти, запазете VBA макро и работната книга на Excel и в резултат на това информацията от Active Directory се появява в съответните полета на Excel. Красотата на този скрипт е, че той е доста универсален и с малки модификации ще помогне за динамично извличане на почти всяка информация от Active Directory точно в работната книга право в работната книга на Excel!