Всем доброго времени суток.

В компании, куда пришел работать, первоначальную настройку AD производила стороння компания. Была развернута AD на базе MS Windows 2008 R2. Для почты был поднят MS Exchange 2010. Все, на этом работы закончились. Проводя ревизию, я обнаружил, что пользователи заведены в отдельную OU, с название CompanyName_Users. Пользователей около 1000 человек. Я решил навести порядок. Запосил у отдела кадров «штатку». Создал OU на основе штатки. Получилась такая вложенность:
CompanyName_Users->Департамент->Подразделение->Юзер.

Начал перемещать пользователей в соответствующие OU. После 15-го пользователя понял, что процесс затянется надолго, да еще и отвлекают по другим «неотложным делам» 🙂 . Решил автоматизировать работу с помощью скрипта. Скрипт решил писать на PowerShell’е. Он имеет все необходимые командлетты для работы с объектами AD. Опыт работы с командлеттами имелся, например тут и тут.

Исходные данные имелись в виде файла Excel, где находилось штатное расписание компании, любезно предоставленное отделом кадров. С помощью фильтров Excel, выбирал сотрудников подразделения. Этот список копировал на отдельный лист. Получался столбец с фамилиями. Столбец назывался displayname.

После этого данный лист сохранялся, при сохранении «Тип файла» выбирался «Текст Юникод (*.txt)»

 

При попытке импортировать этот файл, я обнаружил, что русские символы импортируются из файла в виде знаков вопросов. Да и в консоли при русской раскладке вводились знаки вопросов. Решение этого вопроса нашлось в интернете. Необходимо сменить кодовую раскладку консоли командой chcp 1251 и сменить шрифт на Lucida Console.

После этих действий все чудесно заработало.

Итак готовый файл со списком фамилий нужного подразделения помещался в директорию Scripts на диске C:\ . Имя файла usermove.txt

Итак ниже собственно сам скрипт:



# Подключаем модуль Powershell для работы с AD
Import-Module ActiveDirectory -ErrorAction SilentlyContinue

#Меняем кодовую страницу, поменять достаточно 1 раз
chcp 1251

# OU Куда переносим пользователей
$targetOU = «OU=Подразделение_1,OU=Департамент_1,OU=CompanyName_Users,DC=office,DC=local»

#OU Откуда берем пользователей
$sourceOU=»OU=CompanyName_Users,DC=office,DC=local»

# Присваем путь к файлу с ФИО нужных пользователей
$impfile = «C:\Scripts\usermove.txt»

# Создаем массив $users и загружаем в него пользователей
$users = Import-CSV $impFile

#Запускаем цикл и обрабатываем каждую строчку массива.
foreach ($user in $users)
{
#Присваиваем переменной $dplname значение строки из столбца displayname массива $users
$dplname = $user.displayname

#В массив $usermove заносим атрибуты пользователя, чье отображаемое имя (атрибут name) сейчас в переменной $dplname.
# Поиск происходит в OU, содержащее имя занесенное в переменную $sourceOU. Глубина поиска (задается параметром -SearchScope OneLevel) только текущая OU, все нижестоящие OU не просматривать.

$usermove=get-aduser -f {name -eq $dplname} -SearchBase $sourceOU -SearchScope OneLevel

#Распечатываем для проверки переменные
write-host «Пользователь $dplname»
write-host
write-host «Перенос $usermove.distinguishedname»
write-host

# Перенос пользователя в нужную OU
Move-ADObject -Identity $usermove.distinguishedname -TargetPath $targetOU
}

#Вывожу на экран для проверки куда перемещаю пользователей.
$targetOU

#All done


 

Вот собственно и все. В планах заполнение атрибутов пользователей таких как:

Имя атрибута Описание атрибута
dn   различимое имя объекта в АД
objectclass   тип объекта - user, computer
SamAccountname   имя, под которым входят в домен
sn   Фамилия
givenname   Имя
userprincipalname   полное имя
mail   электронная почта
displayName   выводимое имя
description   описание
department   департамент
company   компания
telephoneNumber   номер телефона
physicalDeliveryOfficeName   комната
WWWHomePage   вебстраница
initials   инициалы
streetAddress   улица
postOfficeBox   почтовый ящик
postalCode   индекс
l   город
st   область
homePhone   домашний телефон
pager   пейджер
mobile   мобильник
ipphone   ip телефон
facsimileTelephoneNumber   факс
title   должность
info   заметки

 

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

UPDATE (30/07/2012)
Скрипт готов, смотреть тут.

Tagged with:  

8 Responses to Перемещение пользователей из списка в нужную OU

  1. Виталий:

    Добрый день.

    Не удается запустить скрипт, выдает следующую ошибку. Помогите, пожалуйста, разобраться:

    Move-ADObject : Не удается проверить аргумент для параметра «Identity». Аргумент имеет значение NULL, либо элемент коллекции аргументов имеет значение NULL.
    C:\temp\usermove.ps1:34 знак:25
    + Move-ADObject -Identity $usermove.distinguishedname -TargetPath $targetOU
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (:) [Move-ADObject], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.MoveADObject

    • Здравствуйте.
      Передайте нормальное значение параметра Identity.

      • Виталий:

        прошу прощения, но можете уточнить, каким именно образом? Скрипт копировал Ваш, естественно, меняя OU и организацию на свои…

        • Скрипт мой, а данные Ваши. Сформируйте правильные данные для скрипта. Файл C:\Scripts\usermove.txt

          • Виталий:

            перепроверил файл, данные ввожу из поля «Выводимое имя» в AD. Пробовал делать его в формате .csv, естественно, меняя это также в скрипте. Во write-host «Пользователь $dplname» отображается корректное имя, которое имеется в AD, при этом ошибка сохраняется…

          • Выводится ли строчка
            write-host «Перенос $usermove.distinguishedname»
            на экран или пусто после слова Перенос ?

  2. Виталий:

    «Выводится ли строчка
    write-host «Перенос $usermove.distinguishedname»
    на экран или пусто после слова Перенос ?»

    не выводится. Что я делаю не так? Правильно ли я понимаю, что в файле «usermove» столбец должен содержать «Выводимое имя» в AD? Большое спасибо за помощь.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *