如何找到要存储到IExchangeManageStore :: GetMailboxTable的信息存储的专有名称?

时间:2020-03-05 18:58:11  来源:igfitidea点击:

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,将在"服务器DN:"旁边显示所需的字符串。

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

解决方案

回答

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

回答

认为必须有一个纯粹的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。如果其他方法被证明不可靠,我会尝试的。

回答

我将下载MFCMapi的源代码,并查看它们如何做到这一点。