Задача банальна: обновить контактные данные пользователей в AD, основываясь на их ФИО.

Раньше бы я решал эту задачу на смеси моего любимого Perl и WSH.
Но сейчас Microsoft предлагает использовать для этого могучую вещь под названием PowerShell, вот на ней и буду решать эту задачу.

Исходный файл tel.csv имеет следующую структуру:

ФИО;Вн.тел.;Организация;Название отдела;Должность;Корпус;Этаж;Кабинет

Пример:

Иванов Иван Иванович;110;"ООО ""Рога и Копыта""";"НТЦ ""Копыта""";Директор;2;2;;
Сидоров Иван Иванович;119;"ООО ""Копытный двор""";Испытательная лаборатория;Зам. начальника;1;3;1;

Обращу внимание на двойные кавычки, так делает Excel при сохранении в csv.
Для работы скрипта понадобиться оснастка Quest.ActiveRoles.ADManagement, взять можно тут.
Сразу поясню, в PowerShell есть удобная функция для импорта CSV файлов Import-Csv, но на момент написания присутствует проблема с кодировками, поэтому пришлось разбирать файл «вручную».

###################################################################
#Name:		CSVtoAD.ps1
#Version:	1.0.0
#Created:	Andrey Orlov
#Email:		tangarus(a)gmail.com
#Web:		http://www.tangarus.ru/
#Date:		10.2009	
#Description:Обновление данных о пользователях в AD из csv
####################################################################
 
Write-Host "Загрузка оснастки Active Directory."
Add-PSSnapin Quest.ActiveRoles.ADManagement
 
#Функция для чистки входных строк от двойных кавычек
function ClearString ([string]$str){
 
	$str = $str -Replace ' {2,}',''
	$str = $str.TrimStart()
	$str = $str.TrimStart()
 
	$str = $str -Replace """""","@"
	$str = $str -Replace """",""
	$str = $str -Replace "@",""""
 
return $str;
 
}
 
$FileATS = "C:\tel.csv"
$ADSearchRoot = "MYDOMAIN/Пользователи"
$pw = read-host "Enter password" -AsSecureString
 
Connect-QADService -ConnectionAccount "MYDOMAIN\Admin" -ConnectionPassword $pw
 
$Employes = Get-Content $FileATS
$TotalUsrs = 0
$UpdatedUsrs = 0
foreach ($Emp in $Employes)
{	
	$TotalUsrs++
 
	$FullName = $Emp.split(';')[0]
	$IntTel = $Emp.split(';')[1]
	$Title = $Emp.split(';')[4]
	$Dep = $Emp.split(';')[3]
	$Org = $Emp.split(';')[2]
	$Korpus = $Emp.split(';')[5]
	$Floor = $Emp.split(';')[6]
	$Kabinet = $Emp.split(';')[7]
 
	$FullName = ClearString($FullName)
	$IntTel = ClearString($IntTel)
	$Title = ClearString($Title)
	$Dep = ClearString($Dep)
	$Org = ClearString($Org)
	$Korpus = ClearString($Korpus)
	$Floor = ClearString($Floor)
	$Kabinet = ClearString($Kabinet)
 
	if ($CurUser = Get-QADUser -SearchRoot $ADSearchRoot -Name $FullName) 
	{	
		"Пользователь $FullName найден..."
		if (@($CurUser).count -gt 1) {
		"Есть полные тезки, пропускаем!"
		continue
		}
		$CurUser | Set-QADUser -Company "$Org" -Department "$Dep" -Title "$Title" -PhoneNumber "$IntTel" -City "Москва" -Office "Корпус:$Korpus, этаж:$Floor, кабинет:$Kabinet"
		"обновлён."
		$UpdatedUsrs++ 	
	}
}
"Всего пользователей в файле: $TotalUsrs"
"Обновлено пользователей в AD: $UpdatedUsrs"