четверг, 22 сентября 2011 г.

Как навести порядок в ActiveDirectory при помощи PowerShell

Содержимое ActiveDirectory не всегда соответствует реальному состоянию дел в организационной структуре компании. Что приводит ко многим неудобствам при планировании и внедрении систем использующих домен для построения орг. структуры.

Рассмотрим ситуацию когда у вас есть программа учета кадров, совершенно не подлежащая интеграции с вашим любимым ActiveDirectory. Вам надоел вечный бардак в AD и вы хотите подготовить каталог к более рациональному использованию.

Первое что необходимо сделать - это привести в соответствие название организационных единиц в домене и в системе учета кадров.
Втрое разработать идеологию - какие атрибуты учетной записи должны быть заполнены.
Третье заполнить недостающие атрибуты в учетных записях пользователей. Последний пункт не всегда можно полностью автоматизировать.

Мне необходимо было решить несколько проблем:
1. Это добавить атрибут DisplayName к учетным записям пользователей
2. Внести изменения в их должности и переместить в правильные подразделения

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


cls

#Получаем список доступных почтовых адресов пользователей
Get-QADUser -SearchRoot 'domen.local/Usual Users/' | Format-Wide -Column 1 -Property mail | Out-File c:\temp\mail.txt

#Удаляем пустые сроки в файле
gc c:\Temp\mail.txt | where {$_ -ne ""} > c:\Temp\mail1.txt
#Считываем данные из файла в массив
[array]$list = Get-Content c:\temp\mail1.txt

foreach ($item in $List)
{
[string]$item = $List[0]
$item=$item.TrimEnd(' ');
#Ищем контакт по email и вывыодим его -DisplayName
[string]$Dname = Get-QADObject -Type contact -ObjectAttributes @{mail=$item}
$dname
#Удаляем лишние символы
$I = $DName.IndexOf(',')-3
$Dname = $DName.Substring(3, $I)

#Добавляем DisplayName к учетной записи
Get-QADUSer -email $item | Format-Wide -column 1 -Property DisplayName | set-QADUSER -displayName $dname

}


Теперь осталось внести правильные наименования должностей и подразделений в учетные записи и переместить пользователя в нужное подразделение.
Для этого необходимо в начале получить файл с данным о сотрудникам организации в формате
"Табельный номер;Полное имя;Должность;Отдел;" и основываясь на этом файле внести изменения в ActiveDirectory.
Следующий скрипт импортирует данные из csv файла в массив и работает со значениями полученными из файла.


cls
Add-PSSnapin Quest.ActiveRoles.ADManagement

#Функция для получения полного имени выбранного подразделения
function TakeDN ([string]$N)
{
$Nn = $N.TrimEnd(1,' ')
# Получаем полное имя выбранного отдела
Get-QADObject -Type 'organizationalUnit' -Name $Nn | Format-List DN | Out-File C:\Temp\temp.txt
# Удаляем пустые сроки в файле
gc c:\Temp\temp.txt | where {$_ -ne ""} > c:\Temp\temp1.txt
$DN = Get-Content c:\Temp\temp1.txt

[string]$DN = [string]$DN.Remove(0,$DN.IndexOf(' : ')+3)
[string]$DN
}
#Получаем информацию о сотрудниках
$New= Get-Content 'c:\Temp\toad.csv'

#Разбираем файл на значения
ForEach ($item in $New){
#Получаем ФИО
[array]$StrArray = $item.Split(";")
#Получаем отдел или службу

$DspName = $StrArray[1]
$Title = $StrArray[2]
$Department = $StrArray[3]

$Parent = TakeDN $Department

#Изменяем данные и переносим учетную запись в нужное подразделение
Get-QADUser -DisplayName $dspname | Set-QADUser -ObjectAttributes @{department = $Department; title = $Title} | Move-QADObject -NewParentContainer $Parent
}

1 комментарий:

Shpilman комментирует...

Думается мне, в начале потерялась строчка
Add-PSSnapin Quest.ActiveRoles.ADManagement
И не совсем понятно, зачем каждый раз перенаправлять вывод в файл, можно все было бы сделать через переменные. Да и использование Import-Csv упростило бы жизнь (только обращайте внимание на кодировку импортированного файла).