Skip to content

Изменение расписания соединителей AD и SCCM из PowerShell

Изменение расписания соединителей AD и SCCM из PowerShell published on Комментариев к записи Изменение расписания соединителей AD и SCCM из PowerShell нет

imageКак известно, соединитель 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 (по местному времени). Обратите внимание, что сохранение происходит в два этапа: обновление объекта настроек коннектора, затем обновление источника данных коннектора.

Поделиться в соц. сетях

Primary Sidebar