Лень — двигатель прогресса…

Вот и я, найдя немного свободного времени, решил автоматизировать достаточно рутинную для каждого админа задачу — создание и отключение пользователей.

1. PowerShell


Началось все с создания скрипта на PowerShell, где с консоли предлагалось ввести данные пользователя. В результате создавался пользователь AD в соответствующем OU, с заполненными полями.



$files = Get-ChildItem -LiteralPath \\server\users$ -Include *.txt -File

foreach ($file in $files) {
    $text = Get-Content -Path $file.FullName
    $data = $text.Split(";")
    $action = $data[0]
    $name = $data[1]
    $lastName = $data[2]
    $password = $data[3]
    $project = $data[4]
    $position = $data[5]
    $pc = $data[6]    

    if ($action -eq "Add") {
        createADUser $name $lastName $project $position $password $pc
    } 
    
    elseif ($action -eq "Suspend") {
        disableAdUser ("$name.$lastName")
    }
    
    $file.Delete()   
}

function createADUser($name, $lastName, $project, $position, $password, $pc) {

    $office = "Head Office"
    $path = "OU=Users,DC=corp,DC=mydomain,DC=com"
    $login = "$name.$lastName".ToLower()    

    if ($project -ne "") {
        $path = "OU=$project,$path"
    }

    if ($password -eq "") {
        $password = "12345678"
    }

    New-ADUser -Name "$name $lastName" -DisplayName "$name $lastName" -GivenName $name -Surname $lastName -SamAccountName $login -UserPrincipalName "$login@corp.mydomain.com" -Path $path -Enabled $true -AccountPassword (ConvertTo-SecureString -AsPlainText $password -Force)

    Set-ADUser -Identity "$name.$lastName" -Department $projectName -Title $position -Office $office -ChangePasswordAtLogon $true -EmailAddress "$login@mydomain.com"

    Set-ADAccountPassword -Identity "$name.$lastName" -NewPassword (ConvertTo-SecureString -AsPlainText $password -Force)

    Add-ADGroupMember -Identity GroupName -Members "$name.$lastName"

    if ($pc -ne "") {

        Set-ADUser -Identity "$name.$lastName" -Description $pc.ToUpper()

        setAdmin $pc $login
        setPcConfig $pc
        setPcOwner $pc $login           
    }

    sendMail "$login has been created"
}


function disableAdUser ($user) {
    
    $userObj = Get-ADUser -Identity $user

    Set-ADUser -Identity $user -Enabled 0    
    Move-ADObject -Identity $userObj -TargetPath "OU=Fired_users,OU=Users,DC=corp,DC=mydomain,DC=com"

    sendMail "$user has been disabled"    
}


2. Google Apps Script


Далее создаем почтовый ящик, который в моем случае хостится на Gmail. Благодаря этому можно использовать замечательный сервис Apps Script. В его основе лежит JavaScript. Обилие документации и небольшой опыт программирования помог разобраться с этим делом. Здесь аналогично передаем данные функции — аккаунт создан.

Этим же инструментом переделываем шаблон Welcome-письма, заменяя %username% и т.д. на реальные данные и отправляем pdf HR-ам, боссу, новому пользователю и конечно себе.

function createUser(name, lastName, gender, groups, password, title, department) {
  
  var userMail = email((name + "." + lastName).toLowerCase()); 
  var admin = email("admin");
  var recipients = admin + "," + email("hr") + "," + email("boss");
  var subject = "Welcome! " + name + " " + lastName + " - " + title;
  var body = "Welcome to the jungle";
  var attachment = makeWelcome(name, lastName, password);
  
  var resource = {
    "name": {
      "familyName": lastName,
      "givenName": name
    },
    "password": password,
    "primaryEmail": userMail,
    "changePasswordAtNextLogin": true,
    "organizations": [{
      "title": title,
      "department": department
    }],
    "gender": {
      "type": gender
    }
  }
  
  AdminDirectory.Users.insert(resource);  
  Logger.log(userMail + "'S BEEN CREATED");
    
  for (var i = 0; i < groups.length; i++) {
    addMember(groups[i], userMail);
  }  
  
  var options = {
    "attachments": [attachment],
    "name": "Sysadmin"
  }
  
  MailApp.sendEmail(recipients, subject, body, options);
  MailApp.sendEmail(userMail, "Welcome!", body, options);
}

3. UI, автоматизация


Конечно, ввод данных с двух консолей — не тот результат, который хотелось бы получить. По-этому была создана гугл-форма для данных. Скрипты добавлены в планировщик на повтор каждые 5 мин.


После отработки гугл-скрипта, через Backup and Sync (GDrive) данные ввиде текстового файла передаются в локальную сеть. Здесь за дело берется PowerShell — парсит файл и создает пользователя AD. Вот теперь красиво!

Комментарии (7)


  1. avelor
    08.04.2018 21:27

    Интересный вариант, спасибо.
    Я бы только делал наоборот — данные вносим в форму в офисе (это может быть и gui, и консоль, и веб-сервис), дальше передаем данные в гугл-скрипт. Или post/get запросом, или даже спецписьмом на служебный (или не служебный) ящик. А то механизм синхронизации через gdrive выглядит не очень:)

    А в идеальном мире пользователи заводятся сами при приёме на работу (выгрузкой хоть из 1с ЗУП или любой другой кадровой системы) видел правда реальный раьотающий пример только один раз, в очень крупной конторе с чёткими бизнес-процессами и дисциплиной.


    1. braker07 Автор
      09.04.2018 20:47

      Изначально так и было. Отрабатывал ps1 скрипт, отправлял письмо на Гугл-ящик, где создавался аккаунт. Но первое, что пришло в голову, удобный и быстро реализуемый UI, стала гугл-форма. С GDrive была небольшая загвоздка — он работает при выполненном входе в систему. Но добавив в планировщик, можно запускать его в фоне. Просто и стабильно.


      1. avelor
        09.04.2018 21:32

        Гуй на павершелле довольно легко реализуется. Лично я делал схожую схему в своё воемя вовсе на автоите (до павершела) :)
        Ну или если со стороны гугля — то можно вебсервис простенький поднять и ловить запросы от гуглскрипта. Не очень люблю просто планировщики… впрочем, это вкусовщина.


  1. SmileyK
    09.04.2018 12:37

    А где кровь? Мне интересен скрипт который на ps1 поделитесь


    1. braker07 Автор
      09.04.2018 14:49

      Добавил к публикации


  1. RandDragon
    09.04.2018 12:37

    Вот сейчас как раз пишу синхронизацию 1с ЗУП и AD. Правда реализовано все это с помощью C#. Админ ранее реализовал все это через PowerShell.


    1. avelor
      09.04.2018 21:34

      А если не секрет — зачем сишарп? Мне кажется, что сложнее поддерживать, нежели павершел, лазающий в 1с через ком-соединение или вызовы из 1с к ad через adsi (ком-объект).