Создание профилей MAPI без установки Outlook

Переводы статьи Переводы статьи
Код статьи: 306962 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

Согласно распространенному ошибочному мнению, для создания профилей MAPI на сервере Microsoft Exchange должен быть установлен клиент MAPI, например Microsoft Outlook или клиент Exchange. А на самом деле клиент MAPI для этой цели не нужен. Корпорация Майкрософт не рекомендует устанавливать на рабочих серверах клиент MAPI (Outlook). При наличии подсистемы MAPI существует масса других способов создания профилей MAPI (на сервере Exchange эта система установлена).

Дополнительная информация

Способы создания профилей MAPI

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

Прежде чем создавать профили с помощью этих способов, следует внести правильные записи в файл Mapisvc.inf на сервере. Дополнительные сведения об изменении этого файла см. в следующей статье базы знаний Майкрософт:
294470 Добавление в файл Mapisvc.inf записей для служб Exchange (Эта ссылка может указывать на содержимое полностью или частично на английском языке)

Использование программы NewProf.exe

Служебная программа NewProf.exe входит в состав Outlook. Дополнительные сведения об использовании этой программы см. на веб-узле корпорации Майкрософт по следующему адресу:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mapi/html/3240685a-f8a8-48a1-8ec5-8dac8869877f.asp
Дополнительные сведения см. в следующих статьях базы знаний Майкрософт
145905 Параметры командной строки, поддерживаемые программой Newprof.exe (Эта ссылка может указывать на содержимое полностью или частично на английском языке)
148664 Описание файла характеристик профиля (PDF) (Эта ссылка может указывать на содержимое полностью или частично на английском языке)

Использование примера программы ProfMan2

Этот пример использует интерфейс MAPI IProfAdmin, описанный в разделе «Использование интерфейса MAPI IProfAdmin». Для его получения загрузите следующую статью базы знаний Майкрософт:
228736 Архив Profman2.exe — диспетчер профилей MAPI, версия 2.0 (Эта ссылка может указывать на содержимое полностью или частично на английском языке)

Использование функции MAPILogonEx

При вызове функции MAPILogonEx путем установки флага MAPI_LOGON_UI без указания профиля интерфейс MAPI запускает мастер создания профилей, если профили в компьютере отсутствуют. При наличии профилей MAPI выводит диалоговое окно Выбор профиля. Нажмите кнопку Создать, чтобы запустить мастер создания профилей.
Пример кода
// CreateProfileWithMAPILogonEx function: This takes advantage of the 
// profile prompt dialog's "New" button.
bool CreateProfileWithMAPILogonEx()
{
    HRESULT         hRes = S_OK;        // Return code from MAPI calls.
    LPMAPISESSION   lpSession = NULL;   // MAPI Session pointer.

    // Initialize MAPI.
    if (FAILED(hRes = MAPIInitialize(NULL)))
    {
        cout<<"Error initializing MAPI. hRes = 0x"<<hex<<hRes<<dec<<endl;
        return FALSE;
    }

    // Instruct user to click the "New" button.
    cout<<"When the \"Choose Profile\" dialog appears, click the \"New\" button"
        <<"to configure a new profile."<<endl;

    // Call MAPILogonEx to display the profile chooser dialog box.
    if (FAILED(hRes = MAPILogonEx(NULL,
                                  NULL,
                                  NULL,
                                  MAPI_LOGON_UI,
                                  &lpSession)))
    {
        cout<<"Error logging on. hRes = 0x"<<hex<<hRes<<dec<<endl;
        return FALSE;
    }

    // Log off the session.
    if (FAILED(hRes = lpSession->Logoff(0,0,0)))
    {
        cout<<"Error logging off. hRes = 0x"<<hex<<hRes<<dec<<endl;
    }

    // Release the session.
    lpSession->Release();

    // Uninitialize MAPI.
    MAPIUninitialize();

    // true, which indicates success.
    return TRUE;
}
				

Использование функции LAUNCHWIZARDENTRY

Данная функция напрямую вызывает мастер создания профиля.
Пример кода
// CreateProfileWithLAUNCHWIZARD function: This uses the LAUNCHWIZARDENTRY API
// to display the profile configuration UI.
bool CreateProfileWithLAUNCHWIZARD()
{
    HRESULT     hRes = S_OK;                    // Return code from MAPI calls.
    TCHAR       szProfName[80] = {0};           // String to hold profile name.
    LPTSTR      szServices[] = {"MSEMS", NULL}; // String to hold message service names.

    // Call LaunchWizard to add the MSEMS service.
    if (FAILED(hRes = LaunchWizard(NULL,
                                   NULL,
                                   (LPCTSTR *)szServices,
                                   80,
                                   szProfName)))
    {
        cout<<"Error launching wizard. hRes = 0x"<<hex<<hRes<<dec<<endl;
        return FALSE;
    }

    // Return true indicating success.
    return TRUE;
}
				

Использование интерфейса MAPI IProfAdmin

Этот интерфейс MAPI позволяет программным путем создавать профили без участия пользователя.
Пример кода
// CreateProfileWithIProfAdmin function: This uses the MAPI IProfAdmin to 
// programmatically create a profile. No UI is displayed.
bool CreateProfileWithIProfAdmin()
{
    HRESULT         hRes = S_OK;            // Result from MAPI calls.
    LPPROFADMIN     lpProfAdmin = NULL;     // Profile Admin object.
    LPSERVICEADMIN  lpSvcAdmin = NULL;      // Service Admin object.
    LPMAPITABLE     lpMsgSvcTable = NULL;   // Table to hold services.
    LPSRowSet       lpSvcRows = NULL;       // Rowset to hold results of table query.
    SPropValue      rgval[2];               // Property structure to hold values we want to set.
    SRestriction    sres;                   // Restriction structure.
    SPropValue      SvcProps;               // Property structure for restriction.
    char            szProfile[80] = {0};    // String for profile name.
    char            szMailbox[80] = {0};    // String for mailbox name.
    char            szServer[80] = {0};     // String for server name.

    // This indicates columns we want returned from HrQueryAllRows.
    enum {iSvcName, iSvcUID, cptaSvc};
    SizedSPropTagArray(cptaSvc,sptCols) = { cptaSvc, PR_SERVICE_NAME, PR_SERVICE_UID };

    // Get configuration info from user.
    cout<<"Enter name for profile: ";
    cin>>szProfile;
    cout<<"Enter Exchange mailbox name: ";
    cin>>szMailbox;
    cout<<"Enter Exchange server name: ";
    cin>>szServer;

    // Initialize MAPI.

    if (FAILED(hRes = MAPIInitialize(NULL)))
    {
        cout<<"Error initializing MAPI.";
        goto error;
    }

    // Get an IProfAdmin interface.

    if (FAILED(hRes = MAPIAdminProfiles(0,              // Flags.
                                        &lpProfAdmin))) // Pointer to new IProfAdmin.
    {
        cout<<"Error getting IProfAdmin interface.";
        goto error;
    }

    // Create a new profile.

    if (FAILED(hRes = lpProfAdmin->CreateProfile(szProfile,     // Name of new profile.
                                                 NULL,          // Password for profile.
                                                 NULL,          // Handle to parent window.
                                                 NULL)))        // Flags.
    {
        cout<<"Error creating profile.";
        goto error;
    }

    // Get an IMsgServiceAdmin interface off of the IProfAdmin interface.

    if (FAILED(hRes = lpProfAdmin->AdminServices(szProfile,     // Profile that we want to modify.
                                                 NULL,          // Password for that profile.
                                                 NULL,          // Handle to parent window.
                                                 0,             // Flags.
                                                 &lpSvcAdmin))) // Pointer to new IMsgServiceAdmin.
    {
        cout<<"Error getting IMsgServiceAdmin interface.";
        goto error;
    }

    // Create the new message service for Exchange.

    if (FAILED(hRes = lpSvcAdmin->CreateMsgService("MSEMS",     // Name of service from MAPISVC.INF.
                                                   NULL,        // Display name of service.
                                                   NULL,        // Handle to parent window.
                                                   NULL)))      // Flags.
    {
        cout<<"Error creating Exchange message service.";
        goto error;
    }
        
    // You now have to obtain the entry id for the new service.
    // You can do this by getting the message service table
    // and getting the entry that corresponds to the new service.

    if (FAILED(hRes = lpSvcAdmin->GetMsgServiceTable(0,                 // Flags.
                                                     &lpMsgSvcTable)))  // Pointer to table.
    {
        cout<<"Error getting Message Service Table.";
        goto error;
    }

    // Set up restriction to query table.

    sres.rt = RES_CONTENT;
    sres.res.resContent.ulFuzzyLevel = FL_FULLSTRING;
    sres.res.resContent.ulPropTag = PR_SERVICE_NAME;
    sres.res.resContent.lpProp = &SvcProps;

    SvcProps.ulPropTag = PR_SERVICE_NAME;
    SvcProps.Value.lpszA = "MSEMS";

    // Query the table to obtain the entry for the newly created message service.

    if (FAILED(hRes = HrQueryAllRows(lpMsgSvcTable,
                                     (LPSPropTagArray)&sptCols,
                                     &sres,
                                     NULL,
                                     0,
                                     &lpSvcRows)))
    {
        cout<<"Error querying table for new message service.";
        goto error;
    }

    // Set up a SPropValue array for the properties that you have to configure.

    // First, the server name.
    ZeroMemory(&rgval[1], sizeof(SPropValue) );
    rgval[1].ulPropTag = PR_PROFILE_UNRESOLVED_SERVER;
    rgval[1].Value.lpszA = szServer;

    // Next, the mailbox name.
    ZeroMemory(&rgval[0], sizeof(SPropValue) );
    rgval[0].ulPropTag = PR_PROFILE_UNRESOLVED_NAME; 
    rgval[0].Value.lpszA = szMailbox;

    // Configure the message service by using the previous properties.

        if (FAILED(hRes = lpSvcAdmin->ConfigureMsgService(
        (LPMAPIUID)lpSvcRows->aRow->lpProps[iSvcUID].Value.bin.lpb, // Entry ID of service to configure.
        NULL,                                                       // Handle to parent window.
        0,                                                          // Flags.
        2,                                                          // Number of properties we are setting.
        rgval)))                                                    // Pointer to SPropValue array.
    {
        cout<<"Error configuring message service.";
        goto error;
    }

    goto cleanup;

error:
    cout<<" hRes = 0x"<<hex<<hRes<<dec<<endl;
    return FALSE;

cleanup:
    // Clean up.
    if (lpSvcRows) FreeProws(lpSvcRows);
    if (lpMsgSvcTable) lpMsgSvcTable->Release();
    if (lpSvcAdmin) lpSvcAdmin->Release();
    if (lpProfAdmin) lpProfAdmin->Release();

    MAPIUninitialize();
    return TRUE;

}
				

Пример

Загрузите следующий файл с веб-узла центра загрузки Microsoft:
Profiler.exe
Дата выпуска: 22 октября 2001 г.

Дополнительные сведения о загрузке файлов с узла технической поддержки корпорации Майкрософт см. в следующей статье базы знаний:
119591 Как загрузить файлы поддержки Microsoft из Интернета
Корпорация Майкрософт проверила этот файл на наличие вирусов. Корпорация Майкрософт использует последние версии антивирусного программного обеспечения на момент публикации файла для проверки его на наличие вирусов. Файл хранится на закрытом сервере, что предотвращает его несанкционированное изменение. Файл Profiler.exe представляет собой простой пример кода Microsoft Visual C++, в котором используются способы 3–5, описанные выше. В состав Profiler.exe входят следующие файлы:

Свернуть эту таблицуРазвернуть эту таблицу
Имя файлаРазмер
Profiler.dsw1 КБ
Profiler.dsp5 КБ
Profiler.cpp12 КБ

Свойства

Код статьи: 306962 - Последний отзыв: 26 ноября 2007 г. - Revision: 8.3
Информация в данной статье относится к следующим продуктам.
  • Microsoft Exchange Server 2003 Enterprise Edition
  • Microsoft Exchange Server 2003 Standard Edition
  • Microsoft Exchange 2000 Server Standard Edition
  • Microsoft Exchange Server 5.5 Standard Edition
  • Интерфейс программирования приложений передачи сообщений MAPI
Ключевые слова: 
kbhowto kbdownload kbmsg KB306962

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com