Моему приложению не удается правильно создать профиль MAPI/Messaging с помощью подсистемы MAPI

У меня есть приложение, которое создает профиль MAPI для отправки писем/сообщений. Профиль правильно создается в среде Outlook2007, но не создается должным образом в среде Outlook2007 SP2. И исходный код, и «среда обмена, для которой используется профиль MAPI/outlook» одинаковы. Профиль создается с помощью подсистемы MAPI.

Описание приложения: Приложение представляет собой сервисное приложение Windows. Служба выполняет COM-приложение. Приложение COM запускает новый поток для создания нового профиля и отправляет образец сообщения.

Актуальная проблема: во время создания профиля вызов функции ConfigureMsgService (которая принадлежит IMsgServiceAdmin) не работает должным образом, хотя он возвращает S_OK. Значение 5-го параметра «lpProps» функции ConfigureMsgService приведено ниже.

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

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

    // For NT Services, need to do this to keep MAPI from
    // displaying dialog boxes.
    ZeroMemory(&rgval[2], sizeof(SPropValue) );
    rgval[2].ulPropTag = PR_CONVERSION_PROHIBITED;  //As the com application is executed by the NT service, this parameter is specified.
    rgval[2].Value.b = TRUE;

Также обратите внимание, что до вызова функции ConfigureMsgService все другие вызовы MAPI, такие как MAPIInitialize, MAPIAdminProfiles, CreateProfile, AdminServices, CreateMsgService, GetMsgServiceTable и т. д., завершаются успешно.

Мой вопрос, тот же код работал правильно в среде Outlook 2007, но не работал в среде Outlook 2007 SP2.

Обратите внимание: 1. при выполнении того же кода из отдельного приложения все работало нормально. 2. Код не работал должным образом, если служба выполнялась как учетная запись локальной системы или как учетная запись сетевой службы.

  1. В чем может быть проблема? Я что-то упускаю.
  2. Есть ли обходной путь?

Заранее спасибо Сараванан


person Saravanan    schedule 07.12.2010    source источник


Ответы (2)


Ваша проблема в № 2 вашей заметки:

Обратите внимание: 1. при выполнении того же кода из отдельного приложения все работало нормально. 2. Код не работал должным образом, если служба выполнялась как локальная системная учетная запись или учетная запись сетевой службы.

Профили MAPI хранятся в кусте текущего пользователя* в реестре (HKEY_CURRENT_USER и HKEY_USERS{user SID}). Системные учетные записи (LocalSystem и NetworkService) не представляют пользовательский куст, который требуется MAPI для записи сведений о профиле.

Самое простое решение — запустить службу под учетной записью пользователя, которой предоставлено право «Вход в качестве службы». В зависимости от того, как запускается ваше COM-приложение (в proc или вне proc), вы можете запустить его от имени конкретного пользователя, а не от системной учетной записи.

*Hive — это термин, используемый для обозначения различных разделов реестра. Здесь мы просто имеем дело с собственным разделом реестра пользователя.

person Joe Doyle    schedule 31.12.2010

Спасибо за ответ.

Я попробовал вашу идею, но она не сработала. В этом случае я говорил с Microsoft, они предоставили исправление для этой проблемы (http://support.microsoft.com/kb/972363), оно исправило ее.

Сараванан

person Saravanan    schedule 04.01.2011