Я много лет занимаюсь поддержкой в сфере информационных технологий и просто не могу подсчитать, сколько раз ответом на мой вопрос: «Какое имя у вашего компьютера?» был непонимающий взгляд — и полная тишина. Что ж, получить ответ на такой вопрос не всегда просто. Вы предлагаете пользователю правой кнопкой мыши щелкнуть на значке My Computer, в раскрывшемся меню выбрать пункт Properties и затем перейти на вкладку Computer Name? Но не все держат на рабочем столе значок My Computer — и мне приходилось говорить со многими пользователями, которые не знают, что означает right-click — «щелкнуть правой кнопкой мыши». А как насчет того, чтобы предложить собеседнику ввести в командной строке цепочку символов ECHO%COMPUTERNAME%? Результат часто не оправдывает затраченных усилий. Да что говорить о целой строке — сплошь и рядом не удается приучить пользователей вводить в окне Run комбинацию из трех символов, cmd.
А между тем знать имя компьютера необходимо при проведении таких операций, как контроль журнала событий, копирование файлов в общедоступный ресурс C$ или анализ реестра. А в крупных организациях чем быстрее вы можете получить эти данные, не обращаясь к пользователям с просьбой ввести их с клавиатуры, тем лучше. Я пришел к заключению, что каталог Active Directory (AD) — идеальное место для хранения такой информации: имя того или иного компьютера можно получить в любое время, не обращаясь к пользователю.
Разумеется, расширение каталога AD за счет введения специальных атрибутов не входит в число неотложных задач администратора: создав класс или атрибут, вы уже не сможете его удалить. Но вы сможете отключать классы и атрибуты с помощью оснастки Active Directory Schema консоли управления Microsoft Management Console (MMC). А когда вы отключите класс или атрибут, ситуация вернется в прежнее состояние, как если бы этих атрибутов и классов не существовало вовсе.
В предлагаемой вашему вниманию статье я разъясняю, как создавать собственные атрибуты AD, которые помогут вам обнаруживать полезные сведения. Вы сможете искать в каталоге AD имена компьютеров и возвращать имя пользователя, который работал с той или иной системой последним. Кроме того, можно будет, щелкнув правой кнопкой мыши на имени пользователя в оснастке Active Directory Users and Computers консоли MMC, открыть оснастку Computer Management для системы, в которой данный пользователь регистрировался последним.
Создание базового идентификатора объекта
Прежде чем приступать к созданию собственных атрибутов и классов, следует создать собственный идентификатор объектов Object Identifier (OID). OID представляет собой уникальный идентификатор, который станет базовым средством идентификации всех ваших атрибутов и классов. Он понадобится вам для того, чтобы исключить возможность конфликтов в случаях, когда программные пакеты будут пытаться расширить схему. Так, система Microsoft Exchange добавляет в схему AD многочисленные классы и объекты, и каждый из них имеет собственный OID. Но если вы попытаетесь воспользоваться идентификатором объекта, применяемым в системе Exchange, у вас возникнут проблемы.
Чтобы получить OID, нужно запустить сценарий oidgen.vbs, который можно загрузить по адресу microsoft.com/technet/scriptcenter/scripts/ad/domains/addmvb03.mspx. Самый простой метод — запустить файл .vbs из командной строки и затем перенаправить выходные данные в текстовый файл. Для иллюстрации давайте сохраним файл oidgen.vbs в каталоге с именем OID, который создадим в корне накопителя C. Далее требуется открыть окно командной строки и ввести команду cdOID для перехода в каталог OID. Теперь введите с клавиатуры строку
cscript oidgen.vbs >> OID.txt
В результате в созданный вами каталог будет помещен файл с именем OID.txt. Чтобы данная операция была выполнена успешно, вы должны находиться в том каталоге, в котором был сохранен файл oidgen.vbs. При запуске файла oidgen.vbs генерируется следующий базовый идентификатор OID (мы будем использовать его далее в этой статье): 1.2.840.113556.1.8000.2554.14285.12046.9006.19529.38451.15381839.12108022.
Все классы будут начинаться с этого числа и заканчиваться символами .1.n, где n — номер класса. Таким образом, первый созданный класс будет иметь имя 1.2.840.
113556.1.8000.2554.14285.12046.9006.19529.38451.15381839.12108022.1.1.
Все атрибуты будут начинаться с базового OID и заканчиваться символами .2.n, где n — это номер атрибута. Первый атрибут будет иметь имя 1.2.840.113556.1.8000.2554.14285.12046.9006.19529.38451.15381839.12108022.2.1.
Лучше всего, если все имена созданных вами классов и атрибутов будут начинаться с префикса, содержащего ваше доменное имя. Допустим, к примеру, что у вас доменное имя Contoso.com. Тогда ваш префикс — contosocom. Благодаря использованию доменного имени в качестве префикса все ваши классы и атрибуты будут уникальными. Кроме того, сформированные вами классы и атрибуты будет легче отыскать среди сотен объектов, применяемых по умолчанию. Другие рекомендации можно найти в документации к сценарию oidgen.vbs.
Создание атрибутов и классов
Имея базовый идентификатор OID, вы можете создавать атрибуты и классы с помощью оснастки Active Directory Schema. При первом запуске оснастки Active Directory Schema потребуется зарегистрировать файл schmmgmt.dll с помощью команды
regsvr32 schmmgmt.dll
Затем вы можете создать консоль для просмотра схемы AD. Дополнительные сведения об установке оснастки Active Directory Schema можно найти на technet.microsoft.com/en-us/library/cc755885 (WS.10).aspx.
Эти изменения в схеме следует вносить с сервера, имеющего роль Schema Master Flexible Single-Master Operation (FSMO). Чтобы выяснить, какой сервер является хозяином схемы, нужно открыть оснастку Active Directory Schema, правой кнопкой мыши щелкнуть на схеме Active Directory и в открывшемся меню выбрать пункт Operation Masters. Откроется окно, отображающее текущего хозяина схемы.
Создание атрибута. Для создания атрибута, который будет обновляться при запуске сценария регистрации, выполните перечисленные далее действия.
- Зарегистрируйтесь на сервере, имеющем роль Schema Master FSMO.
- Откройте оснастку Active Directory Schema.
- Правой кнопкой мыши щелкните на папке Attributes и в раскрывшемся меню выберите пункт Create Attribute. Появится предупреждение о том, что вы навсегда изменяете AD. Все правильно, так оно и есть. Когда вы создаете атрибут или класс, его можно только отключить, а удалить нельзя.
- Нажмите кнопку Continue.
- Введите следующие данные (замените показанные здесь сведения соответствующими данными для своей среды, включая идентификатор OID, полученный при выполнении сценария oidgen.vbs):
• общее имя: contosocom-LastComputer;
• имя отображения LDAP: contosocom-LastComputer;
• уникальный идентификатор OID X500: 1.2.840.113556.1.8000. 2554.14285.12046.9006.19529. 38451.15381839.12108022.2.1;
• описание: Last-Computer-User-Logged-On;
• синтаксис: строка, не чувствительная к регистру;
• минимальные или максимальные значения не требуются. - Нажмите ОК.
Возможно, вам придется обновить список, чтобы увидеть только что созданные атрибуты. Еще раз дважды щелкните на атрибуте и убедитесь, что следующие настройки включены:
- Allow this attribute to be shown in Advanced View (позволяет выполнять операции поиска в атрибуте);
- Attribute active (активирует атрибут);
- Replicate this attribute to the Global Catalog (обеспечивает возможность репликации атрибута в другие глобальные каталоги).
Создание класса. Чтобы создать класс, который будет ассоциирован со встроенным пользовательским классом, выполните следующие действия:
- Правой кнопкой мыши щелкните на папке Classes и в открывшемся меню выберите пункт Create Class.
- Нажмите кнопку Continue.
- Введите следующую информацию (опять-таки, заменяя указанные сведения вашими данными):
- • общее имя: contosocom-ITUserInfo;
• имя отображения LDAP: contosocom-ITUserInfo;
• уникальный идентификатор OID X500: 1.2.840.113556.1.8000. 2554.14285.12046.9006.19529. 38451.15381839.12108022.1.1;
• описание: Class-For-Storing-IT-Info;
• тип класса: Auxiliary. - Нажмите кнопку Next.
- Для перехода к факультативным атрибутам нажмите кнопку Add.
- Выберите пункт contosocom-LastComputer.
- Нажмите кнопку ОК.
- Нажмите кнопку Finish.
Чтобы увидеть только что созданные классы, вам, возможно, придется обновить список. Еще раз дважды щелкните на классе и удостоверьтесь, что он активен, выбран.
Присоединение нового класса к встроенному классу. Чтобы ассоциировать только что созданный класс со встроенным пользовательским классом, выполните следующие действия в окне оснастки Active Directory Schema:
- В папке Classes дважды щелкните на пользовательском классе.
- Перейдите на вкладку Relationship.
- Нажмите кнопку Add Class, расположенную рядом с Auxiliary Classes.
- Выберите пункт contosocom-ITUserInfo.
- Нажмите кнопку ОК.
Использование сценария регистрации для обновления пользовательских атрибутов
Чтобы обновить пользовательский объект в каталоге Active Directory, добавив имя компьютера, на котором пользователь регистрируется в данный момент, выполните сценарий UpdateUserInfo.vbs, приведенный в листинге 1. Этот сценарий берет имя пользователя, находит в Active Directory путь к пользовательскому объекту и обновляет атрибут (скажем, contosocom-LastComputer) для пользователя, выполняющего процедуру регистрации. Во фрагменте A я задаю константу для атрибута LastComputer и другую константу — для пути к организационной единице (Organizational Unit, OU). Вам придется модифицировать сценарий с учетом своей среды.
Для ускорения выполнения сценария можно задать константу OU_PATH в корне той OU, где вы разместили своих пользователей. К примеру, если у вас имеется организационная единица с именем Accounts и вы переместили всех своих пользователей в эту единицу, путь OU_PATH будет иметь значение LDAP://OU=Accounts, DC=contoso, DC=com. Теперь замените contoso и com именами, принятыми в вашем домене. Скажем, если имя вашего домена widgetrepair.local, ваш путь LDAP будет иметь вид LDAP://OU=Accounts, DC=widgetrepair, DC=local. При использовании базового пути необходимо, чтобы сценарий просматривал для пользователя все содержимое AD.
Код во фрагменте B задает переменную bDebug и ее значение false. Когда bDebug определяется как false, пользователь не получает сообщений об ошибке. Если у вас возникнут проблемы со сценарием, попытайтесь скопировать его локально, изменив значение bDebug на true, после чего вновь запустите сценарий. Никогда не присваивайте переменной bDebug значение true в сценарии, который работает в производственной сети, ибо в этом случае все пользователи будут видеть все сообщения об ошибках.
Далее сценарий выявляет путь LDAP к пользовательскому объекту в AD. Как правило, администраторы при формировании пользовательских имен берут первую букву имени пользователя и его фамилию (хотя иногда используются и другие соглашения); таким образом, пользовательское имя сотрудника Joe Smith превращается в jsmith. Однако в AD путь LDAP пользователя будет иметь такой вид: LDAP://CN=Joe Smith, DC=CONTOSO, DC=COM. Если в качестве пути LDAP вы попытаетесь использовать путь LDAP://CN=JSmith, DC= CONTOSO, DC=COM, то получите сообщение об ошибке. Но как же получить полное имя пользователя, если известно только его имя регистрации?
Эти данные позволяет получить функция GetLDAPPathFromUserName. Вернемся к нашему примеру с пользователем Joe Smith. Имя sUserName будет иметь вид jsmith во фрагменте C листинга 1. Функция GetLDAPPathFromUserName использует эти сведения для выполнения в каталоге AD поиска пути LDAP, где имя sAMAccountName (термин AD для обозначения пользовательского имени) имеет вид jsmith.
Код во фрагменте D проверяет, не имеет ли переменная sLDAPPath пустого значения. Если значение не пустое, код вызывает функцию UpdateITUserInfo, которая добавляет имя компьютера к пользовательскому объекту.
Для запуска сценария UpdateITUserInfo в процессе регистрации поместите файл VBS в общедоступный ресурс NETLOGON на контроллере домена; затем в окне оснастки Active Directory Users and Computers перейдите на вкладку Profile свойств пользователя и введите UpdateITUserInfo.vbs в качестве имени сценария регистрации. Вторая возможность: разверните настройку групповой политики для этого сценария. Можете также добавить сценарий к существующему сценарию с помощью команды
CscriptSERVER
IT_Scripts$UpdateITUserInfo.vbs
Используйте имя сервера и общедоступного ресурса своей сети.
Настройка контекстного меню, а также параметров поиска и отображения
Далее следует задать параметры поиска и отображения, а также создать элемент пользовательского контекстного меню, который будет отображаться в оснастке Active Directory Users and Computers. Перед тем как создавать параметры отображения, сформируйте каталог общего доступа, в котором будет храниться сценарий DisplayITUserInfo.vbs. В нашем случае я создал каталог IT_Scripts$ на компьютере SERVER.
Загрузите средства Windows Support Tools for Microsoft Windows 2003 (microsoft.com/downloads/details.aspx?FamilyId=6EC50B78–8BE1–4E81-B3BE-4E7AC4F0912D). Установите его на контроллере домена (Domain Controller, DC) и откройте файл ADSIEdit.msc. По умолчанию файл ADSIEdit.msc находится в каталоге C:Program FilesSupport Tools.
Щелчком мыши откройте узел Configura0tion; CN=Configuration, DC=contoso, DC=com; and Display Specifiers. Выделите CN=409 и дважды щелкните на CN=user-display. Для отображения новых элементов контекстного меню, появляющегося при щелчке правой кнопкой мыши на имени пользователя, дважды щелкните на элементе adminContextMenu. В разделе Value введите следующее число, текст, который должен отображаться при щелчке правой кнопкой мыши на имени пользователя, а также имя сценария, который должен запускаться при щелчке на элементе меню. Например:
6, IT User Info…,SERVERIT_Scripts$
DisplayITUserInfo.vbs
Нажмите кнопки Add и ОК. Это действие добавляет элемент IT User Info в меню, которое раскрывается при щелчке правой кнопкой мыши на имени пользователя в окне оснастки Active Directory Users and Computers. Когда вы щелкнете на этом элементе, запустится сценарий DisplayITUserInfo.vbs.
Теперь добавьте легко запоминающееся имя, которое вы сможете использовать для поиска и отображения этого атрибута. Не закрывая окна CN=user-Display properties, нужно перейти по списку вниз до позиции attributeDisplayNames и щелкнуть на пункте Edit. В разделе Value to add следует ввести имя класса и имя отображения. Например:
contosocom-LastComputer, Last Computer
Нажмите кнопки Add и OK.
Наконец, необходимо предоставить всем пользователям доступ с правом чтения и записи к атрибуту contosocom-LastComputer. Откройте окно оснастки Active Directory Users and Computers, нажмите кнопку View и выберите пункт Advanced Features. Правой кнопкой мыши щелкните на имени домена. Можно поступить по-другому — спуститься еще ниже по дереву, скажем, до базовой OU для пользователей. Выберите пункт Properties. На вкладке Security выберите пункты Advanced, Add. Укажите пользователей домена или прошедших аутентификацию пользователей и нажмите кнопку ОК. Теперь перейдите на вкладку Properties и в разделе Apply onto выберите пункт User objects. Прокручивая список, найдите элемент Last Computer или contosocom-LastComputer. Выделите параметры Read и Write. Нажмите ОК.
Отображение информации о пользователе с помощью сценария регистрации
Для отображения имени последнего компьютера, на котором работал пользователь, запустите сценарий DisplayITUserInfo.vbs, представленный в листинге 2. Этот сценарий считывает путь LDAP пользователя и пытается извлечь из него атрибут Last Computer. Во фрагменте A переменная Args применяется к встроенному методу Wscript.Arguments. Оснастка Active Directory Users and Computers автоматически передает сценарию путь LDAP объекта (в данном случае это объект пользователя). Сценарий отобразит данный атрибут, если будет в состоянии обнаружить его. Кроме того, сценарий предоставляет вам возможность открыть оснастку Computer Management для системы (см. фрагмент B).
После настройки всех этих элементов вы можете спокойно ожидать регистрации пользователей. Чтобы определить, запускал ли сценарий тот или иной пользователь, правой кнопкой мыши щелкните на имени пользователя в оснастке Active Directory Users and Computers и в открывшемся меню выберите пункт IT Info. В зависимости от размеров корпоративного домена и от того, как часто ваши пользователи завершают сеансы работы с системой, на совершение полного цикла — когда каждый из пользователей завершит сеанс и вновь зарегистрируется в системе — может уйти несколько дней, а то и недель.
Нужно иметь в виду, что при первом запуске сценария DisplayITUserInfo.vbs атрибуту LastComputer не будет присвоено значение ни для одного пользователя. Когда же всем пользователям будет предоставлена возможность зарегистрироваться с применением нового сценария регистрации, вы увидите некоторые данные. Кроме того, обратите внимание на следующее обстоятельство: сценарий не проводит различия между включенными и выключенными компьютерами; если компьютер выключен, оснастка Computer Management генерирует ошибку.
Вы можете также добавить столбец в (окне оснастки) Active Directory Users and Computers для свойства Last Computer. Для этого надо изменить объект CN=organizationalUnit-Display с помощью файла ADSIEdit.msc. Щелчком распахните узел Configuration; CN=Configuration, DC=contoso, DC=com; and Display Specifiers. Выберите Select CN=409 и дважды щелкните на элементе CN=organizationalUnit-Display. Прокручивая список вниз, найдите extraColumns и нажмите кнопку Edit. В окне Value to add введите строку contosocom-LastComputer, Last Computer,0,200,0 и нажмите ОК.
Дополнительную информацию относительно добавления столбцов в окне оснастки Active Directory Users and Computers см. по адресу msdn.microsoft.com/en-us/library/ms677291(VS.85).aspx.
Теперь при использовании оснастки Active Directory Users and Computers для просмотра пользователей вы сможете увидеть, на каком компьютере пользователь работал в последний раз (если этот пользователь запускал сценарий регистрации). Выделите организационную единицу, куда вы поместили пользователей, в меню View щелкните на пункте Add/Remove Columns, на правой панели выделите пункт Last Computer, а затем нажмите кнопки Add и OK.
Не забывайте, что этот метод не будет работать, если вы поместите пользователей в применяемый по умолчанию контейнер Users.
Игра стоит свеч
У кого-то может возникнуть вопрос: а есть ли смысл вообще пускаться на все эти ухищрения? Могу сказать, что благодаря возможности быстро «прочесать» схему AD в поисках имен компьютеров я недавно сэкономил уйму времени в ситуации, когда программные средства фильтрации URL, установленные в моей компании, представили отчет о том, что с определенного IP-адреса в течение одного часа было сгенерировано несколько тысяч запросов на некий узел Web. Я знал, что пользователь не в состоянии сделать это вручную, и предположил, что здесь не обошлось без вируса. В течение нескольких минут я разрешил IP-адрес в имя компьютера, затем имя компьютера в имя пользователя и тут же дал задание техническому специалисту на удаление вируса. Описанные выше возможности для определения имени компьютера полезны при решении задач обеспечения безопасности, отслеживания производственных ресурсов и поддержки работы справочной службы, а полученные результаты, безусловно, стоят затраченных усилий.
Аарон Голдрик (agoldrick@sfcaustin.com) — ИТ-менеджер клиники в Техасе, MCSE по Windows Server 2003, MCITP: Enterprise Administrator, CCNA и CCDA
ПРОБЛЕМА
Определить имя компьютера порой бывает сложно, если приходится полагаться на данные, вводимые пользователем.
РЕШЕНИЕ
Добавить новое свойство к встроенному объекту User службы Active Directory для хранения имени последнего компьютера, на котором работал пользователь.
НЕОБХОДИМЫЕ РЕСУРСЫ
- Домен Windows 2003 (однородный или смешанный режим Windows 2000).
- Клиенты Windows XP.
- Сценарий OIDgen.vbs.
- Оснастка MMC Active Directory Schema.
- Файл ADSIEdit.msc.
- Текстовый редактор (я рекомендую программу Notepad++, поскольку она обеспечивает подсветку ключевых слов в языке Visual Basic — notepad-plus.sourceforge.net/uk/site.htm).
- Сценарии регистрации UpdateITUserInfo.vbs и DisplayITUserInfo.vbs.
ЭТАПЫ РЕШЕНИЯ
- Добавьте свойство (например, contosocom-LastComputer) к встроенному объекту User службы Active Directory для хранения имени последнего компьютера, на котором работал пользователь.
- Добавьте сценарий регистрации, обновляющий это свойство всякий раз, когда пользователь регистрируется в системе.
- Предоставьте всем пользователям разрешение на обновление свойства.
- Добавьте к объекту User новое контекстное меню, которое запускает сценарий с целью считывания и отображения свойства.
УРОВЕНЬ СЛОЖНОСТИ
4 из 5
Листинг 1. UpdateITUserInfo.vbs
Листинг 2. DisplayITUserInfo.vbs