Всем доброго времени суток.
В компании, куда пришел работать, первоначальную настройку 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)
Скрипт готов, смотреть тут.
Добрый день.
Не удается запустить скрипт, выдает следующую ошибку. Помогите, пожалуйста, разобраться:
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:Scriptsusermove.txt
перепроверил файл, данные ввожу из поля «Выводимое имя» в AD. Пробовал делать его в формате .csv, естественно, меняя это также в скрипте. Во write-host «Пользователь $dplname» отображается корректное имя, которое имеется в AD, при этом ошибка сохраняется…
Выводится ли строчка
write-host «Перенос $usermove.distinguishedname»
на экран или пусто после слова Перенос ?
«Выводится ли строчка
write-host «Перенос $usermove.distinguishedname»
на экран или пусто после слова Перенос ?»
не выводится. Что я делаю не так? Правильно ли я понимаю, что в файле «usermove» столбец должен содержать «Выводимое имя» в AD? Большое спасибо за помощь.
да