Subscribe Twitter

Синхронизация групп в разных доменах при помощи Quest AD CMDlets


Доступ к отчетам открывается через доменные группы, и админам DBA постоянно приходится работать и в Active Directory – создавать\удалять группы, добавлять\удалять пользователей из этих групп и тд.  Для работы в AD есть специальные командлеты Quest AD CMDlets, http://wiki.powergui.org/index.php/QAD_cmdlets_reference, дополнения к PowerShell, которые находятся в свободном доступе http://www.quest.com/powershell/activeroles-server.aspx.

 При помощи этих командлетов упрощаются такие сис.админские кропотливые работы как массовое создание групп, добавление пользователей в определенные группы и т.д. Например, написала небольшой скриптик, который синхронизирует группы в разных доменах. Задача становится актуальной, когда сервер отчетности находится в одном домене, а пользователи в других доменах
Заранее создала таблицу в SQLServer, которая уже содержит названия групп, которые надо синхронизировать
CREATE TABLE [dbo].[Admins_plan](
                [Group_domain_from] [varchar](50) NOT NULL,
                [Group_domain_to] [nvarchar](50) NOT NULL,
                [Town] [varchar](50) NOT NULL,
                [E_mail] [varchar](200) NOT NULL

) ON [PRIMARY]
Group_domain_from Доменная группа – источник
Group_domain_to- Доменная группа - приемник
Скрипт создает подключение к SQL Server $SQLConnection, выполняет запрос $Query к таблице Admins_plan,  создает источник $rdr к  этому запросу.
Далее в цикле перебираются строки источника $rdr, при помощи функции function Edit_group группы сравниваются между собой и если есть расхождения, автоматически добавляются\удаляются учетки Group members из первой группы во вторую. Ход выполнения работы логируется в текстовый файл. При необходимости (и если не полениться J) можно настроить отправку сообщения по E-mail админам в регионах домена – источника, чтоб были уведомлены во сколько точно отработала синхронизация  и какие пользователи были добавлены\удалены. Сам скрипт ниже:

# Скрипт синхронизации групп в разных доменах
# Путь к файлу логирование хода выполнения
$fileName = "C:\log.txt" 

function Edit_group([string]$par0,[string]$par1)
{
$in = (get-qadgroup $par0).dn
$out = (get-qadgroup $par1).dn
$ingroupmembers = get-qadgroupmember $in
$outgroupmembers = get-qadgroupmember $out 

#Если группы не пустые - добавляем\удаляем пользователей в Group_domain_to
get-date |out-file -append $fileName
if (($ingroupmembers -ne $null) -and ($outgroupmembers -ne $null))

                {
                $rez = compare-object $ingroupmembers $outgroupmembers
                               foreach($item in $rez)
                                               {
                                                               if ($item.SideIndicator -eq “<=”){
                                                               $i=$item.InputObject
                                                               add-qadgroupmember $out -Member $i
                                                               'Добавляем '+ $i|out-file -append $fileName
                                                                                                                             }
                                                               if ($item.SideIndicator -eq “=>”){
                                                               $i=$item.InputObject
                                                               remove-qadgroupmember $out -Member $i                                                     
                                                               'Удаляем'+ $i|out-file -append $fileName
                                                                                                                             }
                                               }
                }
'--------------------------------------------------------------------------'|out-file -append $fileName

}

#Создаём подключение к серверу БД
$SQLConnection = new-object System.Data.SqlClient.SqlConnection("server=SERVER_NAME;database=DB_NAME;trusted_connection=true;")

#Запрос к таблице с Админами+доменами
$Query="select Group_domain_from,Group_domain_to from Admins_plan"

$SQLConnection.Open()
$SQLCommand = New-Object System.Data.SqlClient.SqlCommand($Query, $SQLConnection)
 $rdr=$SQLCommand.ExecuteReader()
                #Вызов функции синхронизации
                               While($rdr.Read())
                                          {
                                            $a0=$rdr[0]
                                            $a1=$rdr[1]
                                            

                                               'От группы '+$a0+' в группу '+$a1|out-file -append $fileName
                                                               Edit_group -par0 $a0 -par1 $a1
                                          }

#Закрываем подключение к Серверу БД
$SQLConnection.Close()

Скрипт выполняется ежедневно по расписанию (Windows Task Scheduler) путем запуска .bat файла.

0 комм.:

Отправить комментарий