Поделиться через


Windows PowerShellАвтоматизация подготовки пользователей. Часть 1

Don Jones (Дон Джонс)

Cодержание

Определение целей
Построение начальной структуры
Получение введенных данных
Расширение
В следующих выпусках

Эта статья открывает серию из четырех частей, посвященную созданию практичного реального сценария подготовки пользователей в Windows PowerShell. В данной первой части основное внимание уделяется созданию структуры для сценария. В следующем месяце будет рассмотрено собственно создание нового пользователя с активированным почтовым ящиком в Active Directory и Exchange Server 2007. Еще через месяц я займусь созданием домашних каталогов и применением к ним соответствующих списков ACL (список управления доступом). В завершающем выпуске новый пользователь будет помещен в группы и будут заполнены дополнительные атрибуты Active Directory.

Вопросы и ответы по Windows PowerShell

В На веб-сайте MSDN я нашел класс Win32_OperatingSystem Windows Management Instrumentation (WMI). Там говорится о том, что класс содержит сведения о версии пакета обновления. Когда я запустил Get-WmiObject Win32_OperatingSystem в Windows PowerShell, никаких сведений о пакете обновления отображено не было. Почему?

О Подсистема форматирования Windows PowerShell выбирает в этом классе для отображения подмножество свойств, предусмотренное по умолчанию. Одним из способов отображения всех свойств является использование командлета форматирования для переопределения настроек по умолчанию.

Get-WmiObject Win32_OperatingSystem | Format-List *

Или, если вам требуются только конкретные свойства:

Get-WmiObject Win32_OperatingSystem | 
Format-List BuildNumber,CSName,ServicePackMajorVersion

Определение целей

Самая замысловатая часть подготовки пользователей заключается в принятии решения об источнике поступления начальных данных. Как узнать, каких пользователей требуется создавать? И откуда получить сведения о них, например имена, адреса электронной почты, почтовые адреса, отдел и другие данные?

Практически в каждой среде ответы будут разными, поэтому я создам сценарий, который будет принимать входные данные из самых разных мест. Это приведет к некоторому усложнению сценария, но в долгосрочной перспективе это окупится его гибкостью. Кроме этого, нам требуется создать сценарий, который будет в состоянии создавать сотни новых пользователей так же легко, как одного — в конце концов, речь идет об автоматизации процедуры!

Создание начальной структуры

Я даю много консультаций различным компаниями, и очень часть речь идет о написании сценариев и автоматизации. Неудивительно, что я видел множество сценариев и обратил внимание на то, что обычно администратор создает один сценарий подготовки.

Со временем администратор модифицирует этот сценарий для управления все большим числом задач. Такой подход не плох, но, выделив заранее время для создания несколько более модульной структуры, вы сможете получить более гибкий и удобный в сопровождении сценарий. И для этого даже не потребуется слишком много дополнительной работы.

Я начну с основной функции, названной Provision. В действительности она будет делать не слишком много: просто принимать таблицу хэширования (или массив ассоциативных элементов), содержащую информацию о новом пользователе, а затем вызывать ряд подфункций, которые и будут выполнять все задачи подготовки. Поскольку речь идет о Windows PowerShell, я хочу, чтобы все это работало в режиме конвейера. Поэтому я предполагаю, что функция будет принимать по одной таблице хэширования для каждого нового пользователя, и в ней будет предусмотрена возможность принимать целый конвейер с таблицами хэширования для создания нескольких пользователей.

Основной шаблон функции выглядит примерно следующим образом.

Function Provision {
  PROCESS {
  }
}

Не слишком впечатляет, верно? Но в случае Windows PowerShell этого и не требуется. Блок сценария PROCESS выполняется по одному разу для каждого объекта, переданного функции. Для получения доступа к текущему объекту конвейера в блоке находится переменная $_.

Получение введенных данных

Причина, по которой функция Provision не получает никаких данных самостоятельно, заключается в моем стремлении к большей гибкости и нежелании возвращаться к функции и вносить в нее изменения всякий раз, когда потребуется приспособить ее для новой формы ввода. Вместо этого я создам две функции, получающие данные о новом пользователе: одна из файла CSV, а другая — из базы данных. Пока я буду работать только над функцией, связанной с CSV, поскольку файлы CSV несложно создать в программе «Блокнот» или другом текстовом редакторе (или даже в Microsoft Excel и большинстве приложений баз данных).

У файла CSV есть один подвох, особенно если его предоставил кто-то, слабо разбирающийся в технической области: дело в том, что заголовки столбцов файла могут не быть полноценными атрибутами Active Directory. Это значит, что вместо таких имен столбцов, как sn и samAccountName, вы, скорее всего, получите имена типа Last Name и Logon Name. Это не страшно — Windows PowerShell может выполнить преобразование. Я начну с предположения, что файл CSV содержит следующие ниже столбцы.

  • First Name (имя)
  • Last Name (фамилия)
  • City (город)
  • Department (отдел)
  • Job Title (должность)
  • Logon Name (имя входа в систему)
  • Password (пароль)

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

First Name,Last Name,City,Department,Job  Title,Logon Name,Password
Don,Jones,Las Vegas,IT,Writer,donj,P@ssw0rd
Greg,Shields,Denver,IT,Administrator,gregs,  P@ssw0rd

Я создам функцию с именем ProvisionInputCSV, принимающую в качестве входного параметра имя файла и просто читающую этот файл CSV.

Function ProvisionInputCSV {
  Param ([string]$filename)
  Import-CSV $filename
}

Эту функцию можно запустить отдельно, саму по себе, просто чтобы убедиться в том, что она выполняет чтение файла CSV.

ProvisionInputCSV c:\files\myinput.csv

Теперь мне нужно, чтобы функция преобразовала каждую строку файла CSV в таблицу хэширования. И вместо того чтобы сохранять заголовки столбцов из файла CSV, я намерен преобразовать эти заголовки в более приемлемые для Active Directory имена атрибутов. Для выполнения этого преобразования в Windows PowerShell существует целый ряд способов, но я собираюсь придерживаться относительно простого подхода: для обработки каждой строки файла CSV, по одной за одну итерацию, будет использоваться цикл foreach. Для каждой строки файла будет создана таблица хэширования, и она будет выведена в конвейер.

Взгляните на функцию, показанную на рис. 1. Стоит обратить внимание на несколько моментов.

  • В пределах блока foreach переменная $user содержит единственного пользователя. Конструкция foreach обрабатывает каждую строку из переменной $users и автоматически заполняет переменную $user данными из очередной строки.
  • Поскольку в некоторых заголовках содержатся пробелы, эти заголовки необходимо заключить в кавычки.
  • Я добавил еще один атрибут, displayName, составленный из двух столбцов файла CSV: First Name (имя) и Last Name (фамилия).
  • Write-Output используется для записи каждой таблицы хэширования в конвейер.

Рис. 1 Функция, использующая цикл foreach

Function ProvisionInputCSV {
  Param ([string]$filename)
  $users = Import-CSV $filename
  foreach ($user in $users) {
    $ht = @{'givenName'=$user."First Name";
            'sn'= $user."Last Name";
            'title'= $user."Job Title";
            'department'= $user.Department;
            'displayName'= $user."First Name" + " " + $user."Last Name";
            'city'= $user.City;
            'password'= $user.Password;
            'samAccountName'= $user."Logon Name"
           }
    Write-Output $ht
  }
}                                                  
 

Практический результат всей этой работы заключается в том, что я могу использовать одну функцию для чтения файла CSV и преобразования ее данных в таблицы хэширования. Затем таблицы хэширования можно передать функции подготовки.

ProvisionInputCSV c:\data\myinput.csv | Provision

Поскольку моя функция Provision принимает стандартизованную таблицу хэширования, я могу создать несколько разных функций, генерирующих входные данные — ProvisionInputDatabase, Pro­visionInputSpreadsheet и т.д.

До тех пор, пока эти функции будут выводить стандартизованную таблицу, заполненную данными пользователя, основная функция Provision будет правильно работать. Этот подход означает, что в будущем можно будет использовать совершенно новые источники данных нового пользователя, и при этом не придется изменять основную функцию Provision.

Расширение

В файл CSV можно без труда добавлять столбцы для заполнения их такими данными, как номера телефонов, или любыми другими необходимыми данными. Вам потребуется всего лишь расширить таблицу хэширования для включения этой информации. Допустим, например, что мне требуется добавить в файл CSV Description (описание) и Office (офис). Я просто расширяю таблицу хэширования, добавляя несколько строк, как показано на рис. 2. Другими словами, предоставленную мной основную структуру можно использовать для удовлетворения любых требований, предъявляемых вашей средой к атрибутам каталога учетных записей новых пользователей.

Рис. 2. Переработанная функция

Function ProvisionInputCSV {
  Param ([string]$filename)
  $users = Import-CSV $filename
  foreach ($user in $users) {
    $ht = @{'givenName'=$user."First Name";
            'sn'= $user."Last Name";
            'title'= $user."Job Title";
            'department'= $user.Department;
            'displayName'= $user."First Name" + " " + $user."Last Name";
            'city'= $user.City;
            'password'= $user.Password;
            'samAccountName'= $user."Logon Name";
            'office' = $user.office;
            'description' = $user.description
           }
    Write-Output $ht
  }
}

В следующих выпусках

В следующем месяце я начну заполнять кодом основную функцию Provision и напишу подфункцию, предназначенную для создания учетных записей новых пользователей. Будут приведены две версии этой подфункции — одна для тех, у кого есть Exchange Server 2007 (поддерживающий Windows PowerShell), и другая для тех, у кого его нет. У вас появится действительно вполне пригодный для использования сценарий: он будет просто создавать учетные записи пользователей. Но, поскольку это один из тех видов работы с новыми пользователями, для которой требуется много времени, данная функция поможет вам начать экономить время незамедлительно.

Don Jones (Дон Джонс) является одним из основателей компании Concentrated Technology, где оно еженедельно ведет блог, посвященный Windows PowerShell, SQL Server, App-V и другим темам. С ним можно связаться через его веб-узел.