Выгружаем пользователей AD в базу MS SQL

Здравствуйте!

Продолжаю публикации скриптов. Сегодняшний наш пациент был разработан в процессе создания биллинга звонков. У каждого юзера в Active Direcotry есть поле, в котором прописан его внутренний номер телефона. Этот же номер фигурирует в биллинге, но нам конечно хочется видеть не что-то вроде "1316", а "Иванов Владислав Александрович". 

В сети полно примеров и скриптов, позволяющих достать пользователей из AD в csv-файл. По логике, мы можем потом взять этот csv и импортировать в MS SQL с помощью SSIS-скриптов. Однако это мне это не понравилось, т.к. на выходе у нас получается аж два скрипта, работающих на разных технологиях + один промежуточный файл. И это только для одного домена AD. А у меня их 14.

Исходя из вышесказанного, было принято решение сделать все одним скриптом на любимом Powershell. Так сказать, одним махом всех побивахом.

Для работы скрипта необходим пакет для Powershell Quest-что-то-там... не помню уже дословно ... файл с дистрибутивом называется "Quest_ActiveRolesManagementShellforActiveDirectoryx64_151.msi". Думаю, вы найдете все в Гугле.

 

Add-PSSnapin Quest.ActiveRoles.ADManagement
if (!$args[0]) {
  Write-Host "Не определена переменная!"
} else {
  $domain = $args[0] + ".domain.local";
  $users = Get-QADUser -Enabled -ou "$domain/" -Service "$domain" | Select-Object telephoneNumber, mail, mobile, email, logonname, description, displayname, UserPrincipalName;
  $conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=<sql-сервер>; Initial Catalog=test; Integrated Security=SSPI");
  $conn.open();
  foreach ($item in $users) {
    $cmd = $conn.createcommand();
    $cmd.commandtext = "INSERT users (telephoneNumber, mail, mobile, email, logonname, description, displayname, UserPrincipalName)
        VALUES ('$($item.telephoneNumber)', '$($item.mail)', '$($item.mobile)', '$($item.email)', '$($item.logonname)',
        '$($item.description)', '$($item.displayname)', '$($item.UserPrincipalName)')";
    #try {
      $cmd.executenonquery();
    #}
    #catch [system.exception] {
    #  "caught a system exception"
    #}
  }
$conn.close();
}

Надеюсь, ничего сложного:). Скрипт принимает аргумент - NETBIOS-имя домена.

На всякий случай - внизу за комментарием скрыта конструкция обработки ошибок.

 

Метки: active directory (ru), powershell (ru), скрипт, ms sql server (ru)

ПечатьE-mail

Добавить комментарий


Защитный код
Обновить