Век живи – век учись.
На винфаке товарищ поднял вопрос о подключении клиента к Exchange 2003 по MAPI. Этот вопрос мной никогда не затрагивался. Более того, мне было известно только о следующих вариантах подключения “извне” клиентов:
1. RPC over HTTPS (рекомендуемый MS)
2. OWA (Outlook Web Access)
3. POP3/IMAP4/SMTP (как я понимаю, MS не рекомендует, но поддерживает для совместимости)
Однако, Уильям Станек в кратком справочнике по Exchange 2003 server указывает, что подключение в данном случае возможно, но клиент должен уметь разрешать имя сервера в ip-адрес и сервер должен быть доступен с клиента.
Проблема как раз возникла от того, что в клиенте прописывалось не FQDN Exchange сервера, а Netbios имя. То есть клиент не мог нормально разрешать имя почтовика.

Недавно передо мной была поставлена следующая задача:

В связи с вводом в строй нового файлового сервера часть профилей пользователей было перенесено на новый сервер. Список этих профилей был передан мне в экселевском файле. Необходимо было указать в настройках пользователей, использующих эти профиля, пути к новому хранилищу профилей.

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

Решение задачи начал с получения списка пользователей (логинов) и их профайлов:

Get-QADUser -IncludeAllProperties -SizeLimit 0 | select profilePath,sAMAccountname |
Export-Csv out.csv

Итак, у меня 2 файла – in.csv (2 столбца – путь к профайлу, имя папки профайла) и out.csv (2 столбца – путь к профайлу, логин). Возникает промежуточная задача – получить логины тех пользователей, чьи профили были перенесены, сравнивая первый файл со вторым:

$csv1 = import-csv f:in.csv
$csv2 = import-csv f:out.csv

for ($i = 0; $i -lt $csv1.length; $i++){
    for ($j = 0; $j -lt $csv2.length; $j++){
        if ($csv2[$j].column1 -like $csv1[$i].column1) { ... }
    }
}

Дальше у меня возникла проблема с тем, что делать с этими данными. Полученные логины командлет Set-QADUser отказывался принимать в качестве -Identity. Тупик.

Тут пришла мысль – почему бы не перебирать пользователей из AD и сравнивать с путям к профилям из in.csv и эих пользователей уже передавать в Set-QADUser в случае совпадения профилей? Сказано – сделано:

Get-QADUser -IncludeAllProperties -SizeLimit 0 | ? {$_.profilePath -notlike ''} |
ForEach-Object { $profilePath = $_.profilePath ; $Name = $_.Name ; Import-Csv in.csv |
ForEach-Object { if ($_.oldprofilePath -like $profilePath) { 
$newprofilePath = 'PATH_TO_NEW_PROFILE_STORE'+$_.partOfPath ; Get-QADUser $Name |
Set-QADUser -ObjectAttributes @{profilePath = $newprofilePath} }} }

Вначале я отбираю только тех пользователей, у кого непустые пути к профилям. Затем имя пользователя и его профиль я передаю во временные переменные $profilePath и $Name. Первую из них я сравниваю с теми путями, которые находятся в файле in.csv (колонка oldprofilePath), и, в случае совпадения, создаётся переменная с новым путем к профилю $newprofilePath, заново из AD вытаскивается пользователь $Name и передается в Set-QADUser.

Заработало сразу, хотя на мой взгляд, скрипт несколько корявый. Непонятно почему Set-QADUser не захотел сразу принимать $Name в качестве идентификатора объекта и пришлось использовать связку Get-QADUser $Name | Set-QADUser. Также немного удивило, что около 20% перенесённых профилей никто не использует, и таким образом, скрипт обработал только 80% списка путей из in.csv.

P.S. Коллега Василий Гусев с Технета подсказал, на мой взгляд, более изящное решение по сравнению двух csv-фафйлов:

Вариант 1, как объекты:

$obj1 = import-csv test1.csv
$obj2 = import-csv test2.csv
Compare-Object $obj1 $obj2 -Property НазваниеСтолбца -ExcludeDifferent -IncludeEqual

Вариант 2, как текст:

$txt1 = get-content test1.csv
$txt2 = get-content test2.csv
Compare-Object $txt1 $txt2 -Property {$_ -replace ',.+$'} -IncludeEqual -ExcludeDifferent

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