如何从 Outlook 修改 "stream_autocomplete"?

How to modify "stream_autocomplete" from Outlook?

我一直在尝试修改 Outlook 中的 Stream_Autocomplete 缓存文件(删除特定域的所有自动完成),但我不知道如何 :/...

  1. 首先我的计划是从RoamCache文件夹中获取缓存文件,对其进行解码,在没有我不想要的用户的情况下重写它,然后将其保存在之前的位置(同时确保在此过程中关闭 Outlook,以便在关闭时不会覆盖它)。但我不明白所使用的编码。我在 link 中找到了那个文档,但我不太明白: Autocomplete Stream.

  2. 我试过使用 MAPI,但没有任何结果,因为无法从 MAPI 访问该数据。

  3. 然后我尝试使用 IMAP 但无法弄清楚如何连接到主机(它是一个私有域)。

在这一点上,我正在努力为我的第一个想法找出一种方法。

如果使用 Redemption(任何语言,我是它的作者)是一个选项,它会通过 RDONicknames 对象公开昵称,并允许在会话、Exchange 邮箱或 NK2 文件级别读取和修改昵称.

查看 MSDN 中的 Nickname cache 文章,其中描述了编辑昵称缓存的所有可能方法。

对于 Outlook 2007,自动完成流存储在与配置文件同名且扩展名为 .nk2 的文件中。例如,如果使用“outlook”的默认配置文件,则该文件将被称为“outlook.nk2”。 .nk2 文件存储在 %APPDATA%\Microsoft\Outlook 文件夹中。

Outlook 2010 及更高版本

Outlook 2010 或 Outlook 2013 从邮件帐户投递商店收件箱的关联内容 table 中的邮件中读取自动完成流。此隐藏消息的消息为 class,主题为 IPM.Configuration.Autocomplete。自动完成流以 PR_ROAMING_BINARYSTREAM 属性 (PidTagRoamingBinary Canonical 属性) 的形式存储在此消息中。自动完成数据可能会临时缓存在位于 %USERPROFILE%\AppData\Local\Microsoft\Outlook\RoamCache 的自动完成 .dat 文件中。但是,.dat 文件只是一个缓存,并不用于在用户退出 Outlook 2010 及更高版本时写回交付存储。

在提到的页面上,您还可以找到以编程方式编辑缓存的建议:

  • 切勿部分修改自动完成流。支持的交互是 1) 将整个自动完成流读入内存,2) 修改内存结构,以及 3) 将整个流写回到邮件帐户投递存储收件箱的 Associated -Contents table (对于 Outlook 2010 或 Outlook 2013)或本地 .nk2 文件 (Outlook 2007)。
  • 当 Outlook 运行 时,请勿与自动完成流交互。如果在您修改流时 Outlook 运行,它可能会在关闭时覆盖您的更改。
  • 不要将 PT_MV_UNICODEPR_MV_STRING8 类型的属性写入 Microsoft Outlook 2003 使用的自动完成流。只有 Outlook 2007、Outlook 2010 和 Outlook 2013 可以理解这些属性。
  • 在开发与 Outlook 2007 交互的代码时,我们建议您在使用标准文件锁定 API(例如,C/C++ 和 C# 中的 FileStream.Lock).
  • 仅修改来自 row-set 自动完成流的类型的属性。有关自动完成流属性和 属性 类型的更多信息,请参阅自动完成流。

Outlook 2003/2007 NK2 File Format and Developer Guidelines document. Also you may find the Understanding Outlook's Auto-Complete Cache (*.NK2) 文章对 .nk2 文件格式进行了深入描述。

如您所见,在 Outlook 中处理自动完成缓存并不是一项简单的任务,它需要 low-level 代码(扩展 MAPI)。这就是为什么我建议考虑按照 Dmitry 的建议使用 Redemption。