2

有一篇Microsoft 知识库文章,其中包含用于打开给定信息存储中的所有邮箱的示例代码。到目前为止它可以工作(需要在比 VC++ 6.0 更新的编译器上进行一些复制和粘贴)。

在某一时刻,它使用信息存储的可分辨名称调用 IExchangeManageStore::GetMailboxTable。对于 Exchange 2007 试用版虚拟服务器映像,它必须如下所示:

"/o=Litware Inc/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Configuration/cn=servers/cn=DC1".

使用OutlookSpy并单击 IMsgStore 和 IExchangeManageStore 会在“Server DN:”旁边显示所需的字符串。

我想避免强迫用户将其放入配置文件中。因此,如果 OutlookSpy 可以做到,我的应用程序如何找出当前打开的邮箱所在的信息存储的可分辨名称?

4

3 回答 3

2

认为必须有一个纯 MAPI 解决方案,我相信我已经弄清楚 OutlookSpy 是如何做到的。


下面的代码片段,插入之后

printf("Created MAPI session\n");

KB194627的示例中,将显示服务器 DN

LPPROFSECT lpProfSect;
hr = lpSess->OpenProfileSection((LPMAPIUID)pbGlobalProfileSectionGuid, NULL, 0, &lpProfSect);
if(SUCCEEDED(hr))
{
    LPSPropValue lpPropValue;
    hr = HrGetOneProp(lpProfSect, PR_PROFILE_HOME_SERVER_DN, &lpPropValue);
    if(SUCCEEDED(hr))
    {
        printf("Server DN: %s\n", lpPropValue->Value.lpszA);
        MAPIFreeBuffer(lpPropValue);
    }
    lpProfSect->Release();
}



更新:EDK 5.5 源代码中有HrGetServerDN
函数,它从给定会话的PR_EMS_AB_HOME_MTA中提取服务器 DN。如果其他方式不可靠,我会尝试。

于 2008-09-18T08:36:36.220 回答
0

它将位于 Active Directory 中,因此您将使用 ADSI/LDAP 查看 CN=Microsoft Exchange,CN=Services,CN=Configuration,DC= example ,DC= com。使用 Sysinternals 的 ADExplorer 在其中进行挖掘以找到您正在寻找的价值。

于 2008-09-17T12:02:38.153 回答
0

我会下载 MFCMapi 的源代码,看看他们是如何做到的。

于 2008-12-30T14:50:49.627 回答