Актуализиране на атрибути в AD—връщане към темата, за системния администратор
Актуализиране на атрибути в AD—връщане към темата
Подобряването на скрипта ви позволява да използвате потребителски имена вместо DN в него
Нека не се връщаме назад и да си спомним как работи оригиналният сценарий. Необходими са поне два параметъра, за да работи. Първият параметър е името на файла с входни данни във формат CSV или Excel. Вторият параметър е името на изходния файл, в който скриптът ще записва всички действия, които извършва. Фигура 1 показва пример на входен файл, който има заглавен ред, съдържащ имената на атрибутите, които трябва да бъдат актуализирани. Първият по ред е DN. Тъй като всеки ред от входния файл се обработва (с изключение на заглавния ред, разбира се), скриптът извиква доставчика на Lightweight Directory Access Protocol (LDAP), за да установи връзка с обекта, който има дадения DN, след което актуализира всеки атрибут със стойностите, посочени във входния файл. За да спести време, скриптът актуализира само онези атрибути, чиито стойности в AD се различават от посочените във входния файл. И накрая, резултатите от скрипта се записват в изходния файл, който съдържа статистика за това колко обекта са били модифицирани, колко атрибута са били променени, както и данни за това колко грешки са направени по време на изпълнението на скрипта.
Нова версия на скрипта
Предишният скрипт работи добре и е достатъчно бърз, но, както беше отбелязано по-горе, той изисква DN на всички потребителски обекти, които ще модифицираме, да бъдат точно посочени, за да работи. И тъй като форматът на името на DN не е типичният формат, който обикновено използваме за идентифициране на потребители, реших да променя кода на скрипта на тозитака че да могат да се използват обикновени потребителски имена вместо DN. Всички знаем как да получим информация за потребителските имена, така че вместо DN би било по-подходящо тези имена да се използват като поле за идентифициране. Въпреки това, за да направите промени в AD чрез LDAP, скриптът все още трябва да преобразува потребителските имена в DN.Стойността на потребителското име се съхранява в AD в атрибута sAMAccountName на потребителския акаунт. По този начин, за всяка стойност на потребителско име във входния файл, скриптът може да поиска AD за потребителския обект, чиято стойност на атрибута sAMAccountName е равна на дадената стойност на потребителското име. Атрибутът sAMAccountName трябва да бъде уникален за всеки потребител, така че или тази заявка ще върне един резултат, от който скриптът може да извлече атрибута адрознено име, или няма да бъдат върнати данни, което означава, че няма потребител с това име в домейна. След като стойността на DN бъде получена, тя може да се използва в скрипта като основа за извикване на доставчика на LDAP за актуализиране на необходимите потребителски атрибути.Друга промяна, направена в скрипта, е използването на именувани аргументи вместо ненаименувани. Когато използвате именувани аргументи, можете да ги предадете на скрипта в произволен ред. Например, в типичен сценарий, аргументите са дадени в дадения ред, както е показано по-долу:
myscript.vbs параметър1 параметър2
В случай на използване на именувани аргументи, скриптът може да се извика по следния начин:
myscript.vbs /p1:параметър1 /p2:параметър2
myscript.vbs /p2:параметър2 /p1:параметър1
В този случай втората и третата опция за повикване са идентични, защото туквсички аргументи имат съответни етикети и следователно могат да бъдат обработени от скрипта в произволен ред. За да определите дали наименуваните аргументи са били зададени при изпълнение на скрипта, използвайте метода WScript.Arguments.Named.Exists, на който се предава името на параметъра, който трябва да се провери. Стойността на наименуван параметър се извлича с помощта на функцията WScript.Arguments.Named.Item, която чете името на съответния аргумент и връща неговата стойност. Списък 1 показва пример за проверка за наличие на именувани параметри, извличане на съответните стойности, които след това се записват в променливи. Въпреки че използването на наименувани аргументи не е строго необходимо за този сценарий, този синтаксис на извикване ще бъде по-познат на онези потребители, които са свикнали да указват опции, когато изпълняват помощни програми от командния ред.
Подробно описание на сценария
Когато извиквате актуализирана версия на скрипт, трябва да се използва следният синтаксис:
updateattribs.vbs /i:inputfile /o:outputfile /basedn:DC=COMPANY,DC=COM /v:yes
Тук ключът /i указва входния файл, ключът /o указва файла с изходни данни, ключът /basedn указва DN името на контейнера (или възел в AD дървото), в който ще се търсят потребителски акаунти. Ключът /v определя дали подробният изход трябва да бъде изведен към конзолата. В самото начало на скрипта се четат стойностите на първите три аргумента: входния файл, изходния файл и базовия DN. Четвъртият параметър, /v, не е задължителен. Името на входния файл трябва да сочи или към CSV файл, или към електронна таблица на Excel, както е показано на фигура 1. 2. Като първи ред този файл трябва да има заглавен ред, който трябва да съдържаимената на всички атрибути, които трябва да бъдат актуализирани, с потребителското име в първата колона.
Тази техника поддържа комуникационния канал между LDAP доставчика и сървъра отворен, така че следващите извиквания към метода GetObject да се обработват много по-бързо.След това скриптът инициализира изходния файл, като го създава с помощта на функцията OpenTextFile на обекта Scripting.FileSystemObject. Тук скриптът създава екземпляр на COM обекта Excel.Application, който отваря входния файл. След това се чете първият ред на този файл, съдържащ имената на атрибутите, които се въвеждат в масива attributeNames. След това този масив се използва за указване на имената на дефинираните от потребителя атрибути, които подлежат на промяна. След това се изпълнява основният цикъл на скрипта, обработвайки всеки ред от входния файл. Започвайки от втория ред (първият ред, съдържащ действителните данни), скриптът чете стойността на първата колона, т.е. потребителско име. След това, използвайки интерфейса ADO (ActiveX Data Objects), се прави повикване към доставчика на ADs, за да извърши заявка за търсене към AD, започвайки от базовото DN ниво, посочено в съответния аргумент на командния ред. Тази заявка търси потребителски обект на AD, чиято стойност на атрибута sAMAccountName съответства на даденото потребителско име, както е показано в списък 3.
Ако полученият набор от данни съдържа някаква стойност, това означава, че необходимият потребител е намерен, в противен случай скриптът показва грешка и продължава към следващия ред. Ако бъде намерено съвпадение, тогава атрибутът differentedName се чете от намерения обект, след което се записва в променливата dn и също така се обвързва към обекта с помощта на методаGetObject. Този метод връща препратка към обекта, която скриптът съхранява в променливата ADObject.Сега можете да промените атрибутите на тези потребителски обекти, чиито препратки са дефинирани от ADObject. Тази задача се изпълнява в скрипта чрез преминаване през масива attributeNames и съпоставяне на стойностите на атрибутите, извлечени от AD, с тези във входния файл. Ако тези стойности се различават, скриптът актуализира стойностите на AD обекта с помощта на метода Put. Всъщност методът Put не записва промени директно в AD, а в локалния кеш. За да актуализирате направените промени, те трябва да бъдат ангажирани (commit), за което скриптът използва метода Setinfo на този обект.По време на изпълнението си скриптът използва няколко променливи, за да съхранява състоянията на броячите за броя на обектите и атрибутите, които се обработват и променят.
Същото се случва и с данните за броя на записаните грешки. Всички тези данни се предават от скрипта към обобщения отчет, който се показва на екрана и се записва в изходния файл. Обърнете внимание също, че когато атрибут се актуализира, и двете му стойности (както предишната, така и актуализираната стойност) също се записват в изходния файл. Следователно, като използвате изходния файл, винаги можете да проверите направените промени и, ако е необходимо, да се върнете към старите стойности.
Изпълнете скрипт
Новата версия на скрипта Updateattribs беше тествана да функционира на следните клиентски операционни системи: Windows XP Service Pack 1 (SP1) и SP2 и Windows 2000 Professional SP3 и SP4. Съответната AD среда е внедрена както на Windows Server 2003, така и на Windows 2000 Server. За да работи скриптът, трябва да имате инсталиран Excel 2000 или по-нова версия на вашия компютър (тованеобходими за обработка на входния файл). Тестването беше извършено с версии на Excel 2003, Excel 2002 и Excel 2000. Тъй като скриптът ще покаже значително количество информация, когато използвате изходен режим, силно препоръчвам да го стартирате през cscript.exe. Ето още няколко неща, които трябва да имате предвид, когато използвате този скрипт:
• Когато описвате входен файл, пътят до него трябва да бъде посочен изцяло (например C:\scripts\myfile.csv). Ако има интервали в описанието на пътя, този низ трябва да бъде ограден в двойни кавички (“C:\My Documents\test.csv”).
• Имената на атрибутите, посочени във входния файл, трябва точно да съвпадат с имената от AD (можете да използвате модула adsiedit.msc или подобен инструмент за проверка). Важно е да запомните, че имената на атрибутите са чувствителни към главни и малки букви.
• Ако скриптът не може да преобразува потребителските имена в DN, проверете дали основният DN е зададен правилно. За по-голяма простота обикновено посочвам името на домейна тук (да речем DC=COMPANY,DC=COM; DC=CORP,DC=COMPANY,DC=COM), за да мога да търся в цялата директория.
• Ако броят на потребителските обекти, които трябва да бъдат обработени, е голям и е известно, че всички потребители, изброени във входния файл, се намират в структурата на конкретен OU, тогава може да се укаже по-точен базов DN, за да се ускори обработката (например OU=SALES,DC=COMPANY,DC=COM или по-точно „OU=New York,OU=Sales,DC=COMPANY,DC=COM”).
Както всеки нов инструментариум, скриптът Updateattribs трябва да бъде валидиран във вашата тестова лаборатория, преди да бъде пуснат в производство. Този скрипт е много бърз. По време на тестове вAD инфраструктура, съдържаща повече от 100 000 обекта, времето за актуализиране на един запис не надвишава една секунда.
ФИГУРА 1: Примерен входен файл за оригинален сценарий Dn,givenName,sn,title “CN=Seguis, Steve,CN=Users,DC=scriptmation,DC=com”,Steve,Seguis,Admin “CN=Guest,CN=Users,DC=scriptmation,DC=com”,Guest,User,Guest Account
ФИГУРА 2: Примерен входен файл за актуализиран скрипт Username,givenName,sn,title sseguis,Steve,Seguis,Admin jsmith,John,Smith,Desktop Technician
Списък 1: Код за проверка, извличане и съхраняване на именувани параметри
Dim infile, outfile, basedn, verbose, argscol Set argscol = WScript.Arguments.Named ‘ НАЧАЛО НА КОМЕНТАР ‘Ако входният файл не бъде намерен, се показва правилният синтаксис на повикване. ‘ END COMMENT If Not argscol.Exists(“i”) Then ShowSyntax Else infile = argscol.Item(“i”) End If ‘ НАЧАЛО НА КОМЕНТАР ‘Ако изходният файл не е намерен, се показва правилният синтаксис на повикване. ‘ END COMMENT If Not argscol.Exists(“o”) Then ShowSyntax Else outfile = argscol.Item(“o”) End If ‘ BEGIN COMMENT ‘Ако параметърът baseDN не е намерен, се показва правилният синтаксис на повикване. ‘ END COMMENT If Not argscol.Exists(“basedn”) Then ShowSyntax Else basedn = argscol.Item(“basedn”) End If If argscol.Exists(“v”) Then If LCase(argscol.Item(“v”)) = “yes” Then verbose = true Else verbose = false End If Else verbose = false End If
Списък 2: Код за свързване към RootDSE и запазване на връзката
Dim dso Задайте dso = GetObject(“LDAP://RootDSE”) Ако Err.Number <> 0 След това WScript.Echo „Не може да се свърже с: “ & “LDAP://RootDSE” WScript.Quit 1 End If
Списък 3: Код за достъп до доставчика на ADs, за да поиска DN търсене за дадено потребителско име