A+ A A-

Система Real-time мониторинга репликации AD

  • Обновлено 01.01.2013 20:15
  • Автор: Николай Андрианов (Slayer)

Содержание материала

Работа системного администратора интересна тем, что постоянно возникают новые задачи, которые требуют новых решений. Появилась необходимость мониторинга состояния репликации между сайтами и контроллерами домена.

Ошибки в репликациях могут возникать по многим причинам, основные из которых: проблемы с каналом (сетью) и проблемы на самом контроллере домена. Я не буду подробно останавливаться на причинах возникновения ошибок - в каждой организации своя специфика инфраструктуры.

Статья первоначально была написана для журнала Windows  IT/Pro RE , здесь представлена более полная авторская версия.

    Для создания полноценной системы мониторинга будут задействованы: два скрипта, две задачи Scheduled Tasks (Назначенные Задания), одна групповая политика (Group Policy). Также понадобится учетная запись с административными полномочиями, работающий в автоматическом режиме сервис Messenger(Оповещатель) на контроллерах домена и рабочих станциях администраторов. Обращаю ваше внимание, что на контроллерах домена должны быть установлены SUPPORT Tools из дистрибутива Windows Server 2003. Также желательно установить Resource Kit для Windows Server 2003 (можно загрузисть с сайта www.Microsoft.com).

 

 Скрипт replic_monitor.bat


    Скрипт обеспечивает сбор статистики.

 

Листинг скрипта:

@echo off
@if not "%OS%"=="Windows_NT" (set INFO=echo && set SEXIT=1) else (set INFO=rem && set SEXIT=0)

%INFO% *********************
%INFO% Script: replic_monitor.bat
%INFO% Creation Date: 24.03.2006
%INFO% Author: Nikolay Andrianov
%INFO% Email: slayer@almodi.org
%INFO% *********************
%INFO% Description: Скрипт мониторинга состояния репликации
%INFO% и ведения ежесуточных логов репликации.
%INFO% *********************
@if "%sexit%"=="1" goto exit

set file_name=%date%
echo --------------------------------------------------------- >> %file_name%_rep_mon.log
@(date/t & time/t) >> %file_name%_rep_mon.log
echo --------------------------------------------------------- >> %file_name%_rep_mon.log
repadmin /showrepl domain.local >> %file_name%_rep_mon.log
echo --------------------------------------------------------- >> %file_name%_rep_mon.log
dcdiag /n:domain.local /test:replications  >> %file_name%_rep_mon.log

:EXIT


 

 

Общая часть всех скриптов

 

Листинг:


@echo off
@if not "%OS%"=="Windows_NT" (set INFO=echo && set SEXIT=1) else (set INFO=rem && set SEXIT=0)

%INFO% *********************
%INFO% Script: replic_monitor.bat
%INFO% Creation Date: 24.03.2006
%INFO% Author: Nikolay Andrianov
%INFO% Email: slayer@almodi.org
%INFO% *********************
%INFO% Description: Скрипт мониторинга состояния репликации
%INFO% и ведения ежесуточных логов репликации.
%INFO% *********************
@if "%sexit%"=="1" goto exit


 

Механизм работы общей части скриптов

Отключаем эхоотображение команд. @ отключает вывод самой команды echo off.
Делаем проверку, запускается ли скрипт на Операционных Системах семейства Windows NT (Начиная от Windows NT 4 и до Windows XP и Windows Server 2003). Если система не Windows NT, то переменной INFO присваиваем значение echo, а переменной SEXIT значение 1. Происходит вывод информации о скрипте и скрипт завершается.


Если система относится к семейству Windows NT, то переменной INFO присваиваем значение rem, а переменной SEXIT значение 0.
Производим анализ переменной SEXIT, и если она равна 1, то завершаем выполнение скрипта.

 

Механизм работы скрипта replic_monitor.bat

1.создаем переменную file_name, которой присваиваем текущую дату из системной переменной %date%
2.Дописываем в файл %file_name%_rep_mon.log вывод команды echo (для форматирования). Если файл не найден, то создаем файл и пишем в него.
3.Дописываем в %file_name%_rep_mon.log  файл текущую дату и время.
4.Дописываем в файл %file_name%_rep_mon.log вывод команды echo (для форматирования).
5.Делаем запрос repadmin /showrepl и указываем домен для которого хотим получить информацию о репликах domain.local. Дописываем в файл %file_name%_rep_mon.log вывод команды.
6.Дописываем в файл %file_name%_rep_mon.log вывод команды echo (для форматирования).
7.Делаем запрос dcdiag, указываем домен /n:domain.local, указываем, что диагностируем репликацию /test:replications. Дописываем в файл %file_name%_rep_mon.log вывод команды.

    Данный простой скрипт можно запускать единовременно или по сценарию. Я применяю запуск по сценарию каждый час во все дни недели. Это обеспечивает меня полной статистикой с разбивкой на сутки. Ниже, я покажу как настроить такое задание.

 

Создаем задание на автозапуск скриптов 

    Для запуска менеджера Scheduled Tasks (Назначенные Задания), вам необходимо проделать путь Start\Settings\Control Panel\Scheduled Tasks. (Пуск\Настройка\Панель Управления\Назначенные Задания. Запускаете мастера Add Scheduled Tasks (Добавить Задание)

Нажимаем кнопку Next

Нажимаем кнопку Browse

Выбираем файл скрипта и нажимаем кнопку Open

Выбираем выполнение задачи ежедневно.

Указываем начальное время.

Указываем домен, учетную запись, пароль и подтверждение пароля.

 

Ставим галочку для открытия расширенных настроек задания.

Указываем дополнительные параметры, если нужно.

Переходим на вкладку Advanced

Настраиваем повторение задачи каждый час в течение 23 часов.

Настройка задачи завершена.

Не забудьте проверить, чтобы у учетной записи, под которой будет запускаться задача, были все права на задачу.

 

Скрипт logon_replic_monitor.bat

    Скрипт обеспечивает диагностику проблем и сообщает администраторам о проблемах с репликацией.
    Скрипт должен находится в расшаренной папке на контроллере домена. У учетной записи, под которой будет запускаться скрипт, должны быть права уровня Modify, на файловую систему и на расшаренный доступ. Так как в скрипте в явном виде указан пароль учетной записи с административными правами, доступ к этой папке должен быть только у администраторов и у учетной записи, под которой будет запускаться скрипт.

листинг:


@echo off
@if not "%OS%"=="Windows_NT" (set INFO=echo && set SEXIT=1) else (set INFO=rem && set SEXIT=0)

%INFO% *********************
%INFO% Script: logon_replic_monitor.bat
%INFO% Creation Date: 24.03.2006
%INFO% Author: Nikolay Andrianov
%INFO% Email: slayer@almodi.org
%INFO% *********************
%INFO% Description: Скрипт мониторинга состояния репликации..
%INFO% Используется при  аутентификации администратора в домен.
%INFO% В случае возникновения ошибки отправляет сообщение администраторам.
%INFO% *********************
@if "%sexit%"=="1" goto exit

set file_name=logon
echo --------------------------------------------------------- > \\dc01\Scripts\%file_name%_rep_mon.log
@(date/t & time/t) >> \\dc01\Scripts\%file_name%_rep_mon.log
echo --------------------------------------------------------- >> \\dc01\Scripts\%file_name%_rep_mon.log
repadmin /showrepl domain.local /u:domain\test /pw:Password >> \\dc01\Scripts\%file_name%_rep_mon.log
echo --------------------------------------------------------- >> \\dc01\Scripts\%file_name%_rep_mon.log
dcdiag /n:domain.local /test:replications  /u:domain\test /p:Password >> \\dc01\Scripts\%file_name%_rep_mon.log

for /f "tokens=1-7" %%A in (\\dc01\Scripts\%file_name%_rep_mon.log) do (
if "%%F"=="failed," ((net send Test "Error in Replication!" & net send dc01 "Error in Replication!" & goto exit))
if "%%E"=="error" ((net send Test "DCDiag: Error in Replication!" & net send dc01 "CDiag: Error in Replication!" & goto exit)))

:EXIT


 

Механизм работы скрипта


1.Создаем переменную file_name и присваиваем ей значение logon
2.Создаем файл %file_name%_rep_mon.log с путем \\dc01\Scripts\ и направляем в него вывод команды echo (для форматирования). Если файл существует, то удаляем его и создаем новый файл и пишем в него.
3.Дописываем в %file_name%_rep_mon.log  файл текущую дату и время.
4.Дописываем в файл %file_name%_rep_mon.log вывод команды echo (для форматирования).
5.Делаем запрос repadmin /showrepl и указываем домен, для которого хотим получить информацию о репликах domain.local, указываем логин и пароль учетной записи /u:domain\test /pw:Password. Дописываем в файл %file_name%_rep_mon.log вывод команды.
6.Дописываем в файл %file_name%_rep_mon.log вывод команды echo (для форматирования).
7.Делаем запрос dcdiag, указываем домен /n:domain.local, указываем, что диагностируем репликацию /test:replications, указываем логин и пароль учетной записи /u:domain\test /p:Password. Дописываем в файл %file_name%_rep_mon.log вывод команды.
8.for /f "tokens=1-7" %%A . Указываем просмотр значений в файле с 1го по 7е включительно. Присваиваем значения переменным начиная с %%A.
in (\\dc01\Scripts\%file_name%_rep_mon.log) указывает файл для анализа и его местоположение.
do  - обязательная часть цикла после, которой указываются действия, которые нужно выполнить.
9.Если находим сообщение об ошибке, то отправляем сообщение администраторам, после чего завершаем выполнение скрипта. if "%%F"=="failed," ((net send Test "Error in Replication!" & net send dc01 "Error in Replication!" & goto exit))
Здесь я использовал группирование команд скобками, а также оператор их последовательного выполнения и символ их последовательного выполнения «&».

    Важно: команда net send может отправлять сообщения не только пользователям, но и компьютерам (точнее всем пользователям, авторизованным на компьютере в данных момент). Так первая команда net send отправляет сообщение пользователю Test, а вторая команда всем авторизованным пользователям на компьютере dc01.
10.Если находим сообщение об ошибке, то отправляем сообщение администраторам, после чего завершаем выполнение скрипта - if "%%E"=="error" ((net send Test "DCDiag: Error in Replication!" & net send dc01 "CDiag: Error in Replication!" & goto exit))) Здесь все аналогично предыдущему пункту, но используется переменная %%E, т.к. мы ищем другое слово ошибки, которое находится в пятой переменной.
11.Метка завершения скрипта :EXIT.

Пункты 1-7 аналогичны по функциям, описанным в первом скрипте, и не требуют дополнительных комментариев.
Обращаю ваше внимание, что в данном скрипте мы использовали авторизацию учетной записи с административными правами! Это сделано для правильного функционирования скрипта при процедуре аутентификации администратора в домен. Без указания логина и пароля скрипт отработает только запрос даты и времени.
В пунктах 9 и 10 я использовал переход на метку EXIT по важной причине. Даже небольшая сеть в случае ошибок репликации генерит больше одной строчки с ошибками. Если не использовать EXIT то при каждом проходе скрипта администраторы будут получать сообщение, что приведет к захламлению рабочего стола сообщениями об ошибках.

Создание задания на запуск по расписанию аналогично для первого скрипта, единственное, что указываем запуск каждые 10 или 15 минут вместо 1 часа.

С более полным описанием синтаксиса команды FOR рекомендую ознакомиться на вкладке «FOR, не все так просто!».

 

Комментарии