Как известно, соединитель AD не имеет возможности изменять расписание, по которому он запускается. Для SCSM 2010 соединитель запускается раз в час, для SCSM 2012 этот интервал увеличен до 24 часов. В небольших доменах такое расписание вполне подходит, но в крупных организациях такой частый запуск может сильно нагружать SQL сервер и сам SCSM. Не смотря на то, что SCSM “забирает” только изменившиеся данные, в крупных организациях это всё равно довольно большой объем данных.
При синхронизации коннектор запоминает update sequence number (USN) домена, и при следующем “прогоне” выбирает объекты только с uSNChanged больше, чем предыдущий USN домена. К сожалению, коннектор не способен отследить изменение полей, поэтому даже при изменении поля, которое не импортируется в CMDB, коннектор выгружает объект AD во временную базу данных.
Для снижения негативного влияния можно пойти двумя путями: разделить коннектор на несколько (к примеру по OU или по типам объектов, или, в случае SCSM12, по LDAP-запросу), или же изменить расписание.К сожалению, изменить расписание через UI или стандартные cmdlet-ы нельзя (хотя можно включить\выключить коннектор). Но его можно изменять через SDK, а его, в свою очередь, можно использовать в PowerShell.
Для начала немного теории. Коннекторы AD и SCCM могут запускаться со следующими интервалами:
Интервал |
Описание |
Параметры |
Значение SyncType |
Минуты | Запуск раз в N минут | Кол-во минут между запусками | SyncTypeEnum.Minutes |
Часы | Запуск раз в N часов | Кол-во часов между запусками | SyncTypeEnum.Hours |
Дни | Запуск раз в N дней | Кол-во дней между запусками Время запуска |
SyncTypeEnum.Daily |
Недели | Запуск раз в неделю | День недели для запуска Время запуска |
SyncTypeEnum.Weekly |
Месяцы | Запуск раз в месяц | День месяца для запуска Время запуска |
SyncTypeEnum.Monthly |
Разово | Запуск один раз | Дата и время запуска | SyncTypeEnum.None |
Данные о настройках каждого коннектора хранят в объектах класса “System.LinkingFramework.DataSource” который имеет много параметров, из которых в данный момент нас интересуют следующие:
Параметр |
Описание |
SyncType | Задает тип интервала, см. таблицу выше |
SyncInterval | Задает размер интервала (минуты, часы, дни) либо день недели или день месяца |
SyncTime | Время запуска (от этого времени будет считаться интервал). При этом не значащая часть время для каждого типа интервала игнорируется. К примеру, для интервала “дни” учитывается только часы, минуты и секунды. |
Если бы это был обычный объект в системе, наша задача бы сводилась к получению нужного объекта класса и обновление его свойств, перечисленных в таблице. Но коннектор работает несколько сложнее, поэтому для получения и изменения его свойств необходимо использовать специальные методы SDK.
Получение расписание коннектора
Начнем с чтения свойств. Тем, кто уже работал с SDK в PowerShell следует обратить внимание, что для работы с коннектором необходимо подключаться к SCSM с помощью класса ServiceManagementGroup, а не EnterpriseManagementGroup. Сам скрипт с комментариями приведен ниже:
# переменная хранит путь к папке SCSM. $SMDIR = (Get-ItemProperty "hklm:\SOFTWARE\Microsoft\System Center\2010\Service Manager\Setup\").InstallDirectory # Добавляем путь к папке с библиотеками SDK $SMSDKDIR = "${SMDIR}\SDK Binaries" # Полный путь к основной библиотеки SDK... $SMDLL = "${SMSDKDIR}\Microsoft.EnterpriseManagement.Core.dll" # .. и дополнительной библиотеки $SMADDDLL = "${SMSDKDIR}\Microsoft.EnterpriseManagement.ServiceManager.dll" # Подключаем обе библиотеки [reflection.assembly]::LoadFile($SMDLL) | out-null [reflection.assembly]::LoadFile($SMADDDLL) | out-null # Подключаемся к серверу SCSM $ServiceManagementGroup = new-object Microsoft.EnterpriseManagement.ServiceManagementGroup "localhost" # Самая важная часть: получаем все коннекторы в нашей системе $connectors = $ServiceManagementGroup.ConnectorFramework.GetConnectors() foreach($connector in $connectors) { write-host $connector.DisplayName write-host ("`tSyncType: " + $connector.ConnectorObject.Item($null,"SyncType").Value) write-host ("`tSyncInterval: " + $connector.ConnectorObject.Item($null,"SyncInterval").Value) if($connector.ConnectorObject.Item($null,"SyncTime").Value) { $syncTime = $connector.ConnectorObject.Item($null,"SyncTime").Value.ToLocalTime() } else {$syncTime = $null} write-host ("`tSyncTime: " + $syncTime) write-host "----------------" }
Довольно простой скрипт, и вот его вывод для моей тестовой среды:
Alerts From OpsMgr SyncType: SyncInterval: SyncTime: ---------------- CI from SCOM SyncType: SyncInterval: SyncTime: ---------------- Connector to SCCM SyncType: SyncTypeEnum.Weekly SyncInterval: 2 SyncTime: 02/29/2012 02:00:00 ---------------- LinkingFramework Server SyncType: SyncInterval: SyncTime: ---------------- SDKDefaultConnector SyncType: SyncInterval: SyncTime: ---------------- Connector to local AD SyncType: SyncTypeEnum.Hours SyncInterval: 1 SyncTime: 07/26/2010 22:43:48 ----------------
Немного пояснений. Обратите внимание на два коннектора: “SDKDefaultConnector” и “LinkingFramework Server”. Это встроенные коннекторы SCSM, и их параметры НИКОГДА нельзя менять. Коннекторы “Alerts From OpsMgr” и “CI from SCOM” относятся к OpsMgr, и также пустые, т.к. их расписание настраивается немножко по другому.
Коннектор для SCCM настроен на запуск каждую неделю (SyncTypeEnum.Weekly) по в вторникам (SyncInterval = 2) в 02:00 (всё время в SCSM хранится в UTC, моя временная зона +4, получаем 22:00 + 4 часа = 02:00). В данном случае день месяц и год в дате игнорируются.
Коннектор для AD настроен за запуск раз в час на 43 минуте (вернее почти на 44й) часа.
Изменение расписания коннектора
Т.к. единственным коннектором, для которого нельзя менять расписание из UI, это коннектор к AD, то показывать буду на его примере. Для изменения расписания нам необходим установить свойства, сохранить, а затем вызвать обновление самого коннектора.
$SMDIR = (Get-ItemProperty "hklm:\SOFTWARE\Microsoft\System Center\2010\Service Manager\Setup\").InstallDirectory $SMSDKDIR = "${SMDIR}\SDK Binaries" $SMDLL = "${SMSDKDIR}\Microsoft.EnterpriseManagement.Core.dll" $SMADDDLL = "${SMSDKDIR}\Microsoft.EnterpriseManagement.ServiceManager.dll" [reflection.assembly]::LoadFile($SMDLL) | out-null [reflection.assembly]::LoadFile($SMADDDLL) | out-null $ServiceManagementGroup = new-object Microsoft.EnterpriseManagement.ServiceManagementGroup "localhost" # Получаем все значения перечисления SyncTypeEnum $syncTypeEnum = $ServiceManagementGroup.EntityTypes.GetEnumerations() | ? {$_.Name -eq "SyncTypeEnum"} $allSyncTypesEnums = $ServiceManagementGroup.EntityTypes.GetChildEnumerations($syncTypeEnum.Id, [Microsoft.EnterpriseManagement.Common.TraversalDepth]::Recursive) # Получаем нужный коннектор по DisplayName (это имя отображается в консоли, можно использовать любые фильтры PowerShell) $connectors = $ServiceManagementGroup.ConnectorFramework.GetConnectors() | ? {$_.DisplayName -eq "AD Main"} foreach($connector in $connectors) { write-host $connector.DisplayName $connector.ConnectorObject.Item($null,"SyncType").Value = $allSyncTypesEnums | ? {$_.Name -eq "SyncTypeEnum.Daily"} $connector.ConnectorObject.Item($null,"SyncInterval").Value = 1 $connector.ConnectorObject.Item($null,"SyncTime").Value = ([datetime]"03.03.2012 19:00").ToUniversalTime() write-host "`tUpdating...." $connector.ConnectorObject.Commit() $ServiceManagementGroup.LinkingFramework.UpdateDataSource($connector.ConnectorObject.Id) write-host "`tComplete" write-host "" }
Этот скрипт устанавливает для коннектора “AD Main” расписание раз в день в 19:00 (по местному времени). Обратите внимание, что сохранение происходит в два этапа: обновление объекта настроек коннектора, затем обновление источника данных коннектора.