Век живи – век учись.
На винфаке товарищ поднял вопрос о подключении клиента к 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 имя. То есть клиент не мог нормально разрешать имя почтовика.

В Текстильщиках есть палатка с дисками. Называется – «Старый пират»! По моему отличное название!

Обращается пользователь: не получается отправить почту – выскакивает ошибка, что превышен лимит на размер ящика, после которого запрещается отсылать письма.

Увеличиваю лимит. Не проходит этот номер. ESM показывает статус «Prohibit send» напротив ящика пользователя. Логи чистые. Увеличил на максимум логгирование ExchangeIS\Mailbox. Тишина.

Переношу пользователя в другое хранилище – оп-ля! Работает! =)

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

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

В принципе задача не сложная. Используя командлет 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 | Where-Object {$_.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

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