Статья размещена автором Бетке Сергей Сергеевич

Powershell и CDOEXM: пишем Exchange командлету для Exchange 2003

Решил отдельно выделить некоторые моменты предыдущей статьи. Покажу вариант реализации управления Exchange Server 2003 с помощью powershell в условиях недоступности exchange management shell.

Итак – Enable-DistributionGroup своими силами.

Для этих целей Exchange Management Shell предоставляет замечательную командлету enable-DistributionGroup, но Exchange 2003 её не предоставляет. Но мы будем вынуждены придумывать некий “костыль” для Exchange 2003. Ранее, при доступе через ADSI можно было воспользоваться методом MailEnable. Приведу фрагмент кода JScript, который эксплуатируется по сей день:

{ // создание группы рассылки

    { // корректировка реквизита displayName для отображения в адресной книге как ГР Персонал...
        var displayName = "ГР " + group.sAMAccountName;
        if (
            changeProperty (group, "displayName", displayName)
        ) group.SetInfo();
    };

    var DLAddr = "all." + mailboxName;
    group.mailNickname = DLAddr;
    group.SetInfo();

    if (!group.mail) {
        group.MailEnable();
        WScript.StdOut.Write("!!!создаём группу рас. " + sn + " : " + DLAddr + "\n");
        group.SetInfo();
    };
};

Посему буду пробовать писать свой обрезанный enable-DistributionGroup, используя ADSI+CDOEXM. Но в любом случае, нам потребуется CDOEXM, который мы не будет устанавливать на Windows 2008 R2, ограничимся exchange server хостом.

Сценарий мы будем исполнять, скажем, на Windows Server 2008 R2, который “ничего не знает” о MS Exchange Server 2003, другими словами, на нём не будет CDOEXM. Соответственно, функционала CDOEXM и метода MailEnable в том числе не будет. Но кто нам мешает в рамках нашего сценария использовать удалённую сессию powershell на Windows Server 2003, на котором установлен MS Exchange Server 2003 и CDOEXM, само собой? Такая идея мне нравится, проста в эксплуатации, не требует установки на “новые” серверы устаревших средств управления (типа CDOEXM) с неизвестными последствиями. Будем пробовать ради теста исполнить на удалённом windows 2003 сервере следующий ADSI+CDOEXM код:

$testDG = [ADSI]"LDAP://CN=Подписка,OU=555,OU=По телефонным номерам,OU=Контакты,OU=iTg,DC=novgaro,DC=ru";
$testDG.MailEnable();
$testDG.SetInfo();

Данный код обеспечивает необходимый нам результат при исполнении на exchange 2003 хосте на базе windows 2003 server. Теперь нам осталось выполнить его удалённо – и задача решена. Итого:

function enable-DistributionGroup {
    param (
        [Parameter(
            Mandatory=$true, 
            Position=0, 
            ValueFromPipeline=$true
        )] 
        [string] 
        $Identity
    )
    begin {
        $session = new-PSSession `
            -computerName 'ваш exchange server 2003 хост';
    }
    process {
        invoke-command `
            -session $session `
            -scriptBlock {
                $DG = [ADSI]"LDAP://$Indentity";
                $DG.MailEnable();
                $DG.SetInfo();
                $DG = $null;
            }
    }
    end {
        remove-PSSession $session;
    }
}

И этот код успешно работает. Возникает проблема с делегированием полномочий, её суть и решение в отдельной статье.

P.P.S. Вызов Enable-DistributionGroup в конвейере в моём случае обладает существенно более высокой производительностью по одной причине: все группы обрабатываются одной удалённой сессией. Если просто вызывать как функцию для каждой группы отдельно – потребуется дополнительное время на открытие и закрытие удалённое сессии для каждой группы.

По аналогии можно построить и другие командлеты для Exchange Server 2003. Пример использования: Powershell: создадим группы рассылки для Exchange по телефонным номерам.

Однако, такой вариант хоть и соблюдает требования инкапсуляции (мы как бы не должны догадываться о том, что на самом деле делает mailEnable()), но не прост в использовании, да и не быстр. Здесь в конце статьи Вы найдёте альтернативное решение, уже без использования удалённых сессий и CDOEXM.

Отзывы » (1)

  1. Нашёл и более красивые варианты. Итого, первая группа решений — использование CDOEXM таким вот странным способом (или без powershell remoting и его проблем, если Вы не используете ADpowershell). Вторая группа решений — самостоятельная установка необходимых атрибутов в AD через ADSI в надежде, что всё остальное сделает RUS. Сейчас этот вариант и использую, и всё прекрасно работает. И третья группа решений — используем WMI объекты exchange 2003 через powershell. И легко, и инкапсуляция не нарушена. Наткнулся на этот вариант здесь.

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка