从VSTO插件获取/设置Outlook 2010/2013中的MailItem权限(分类)

问题描述:

我想出了如何将自定义分类添加到Outlook(使用本地部署的classification.xml和相关策略注册表项)。这些自定义值显示在权限分割按钮菜单中,并使用UI我可以设置分类。但是,我需要做的是根据主动选择的分类值进行一些自定义操作。这是我的挑战。无论在UI中设置什么,都不会反映在Permissions或PermissionTemplateGuid属性中。 任何人都可以告诉我如何获得邮件项目(更具体地说是当前正在撰写的)的主动分类从VSTO插件获取/设置Outlook 2010/2013中的MailItem权限(分类)

编辑:由于旧的工作代码通过检查命令栏按钮状态来解决问题,这显然将不再工作Outlook 2013 - 如果您告诉我如何制作基于功能区的等效内容,我也愿意接受答案 - 因为无法重新使用内置的PermissionRestrictMenu分割按钮。

Office.CommandBarPopup permissionControl = mailItem.GetInspector.CommandBars.FindControl(Office.MsoControlType.msoControlPopup, AddinConfigurationManager.PermissionControlId, Type.Missing, Type.Missing) 
        as Office.CommandBarPopup; 
Office.CommandBarButton restrictedDistributionButton = GetRestrictedDistributionControlIndex(permissionControl); 

其中具有permissionControl.get_accChild

+0

您是否在保存项目后看到更改?如何重新启动Outlook后? – 2015-02-07 23:34:42

+0

你使用什么代码获取属性值?请注意,Outlook不会传播对Outlook对象模型的更改。您需要保存项目以使更改对其他人可见。 – 2015-02-08 12:32:07

+0

在用户界面中进行的任何更改都会保留 - 但只会反映在用户界面中。保存/重新启动无助于从代码访问分类。所以整个故事是我需要修复一个加载项(这是由几年前第三方为我的公司合同构建的)加载项,它适用于Outlook2010,但不适用于2013年,因为代码涉及已弃用的CommandBars。 (请参阅编辑后的代码片段) – 2015-02-09 08:23:05

GetRestrictedDistributionControlIndex交易我想通了也说不定。我在PSETID_Common属性集下发现了一些名为MAPI的属性,它们可以实现分类,分类,分类描述,ClassificationGuid和ClassificationKeep。 为了从UI中检测分类集,我只获取了Classification命名为proptag的值。我发现这个标签使用下面的ID命名空间可访问:

"http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-C000-000000000046}/85B6001F" 

对于设置的MailItem我已经成功的在这个特定的顺序设置属性的分类:分类,ClassificationDescription,ClassificationGuid,分类和ClassificationKeep。

string PSETID_Common = "http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-C000-000000000046}/" 
Outlook.PropertyAccessor pa = mailItem.PropertyAccessor; 
pa.SetProperty(PSETID_Common + "85B6001F", "short name"); // set short name 
pa.SetProperty(PSETID_Common + "85B7001F", "description"); // set description 
pa.SetProperty(PSETID_Common + "85B8001F", "00000000-0000-0000-0000-000000000000"); // set GUID 
pa.SetProperty(PSETID_Common + "85B5000B", true); // Mark as Classified 
pa.SetProperty(PSETID_Common + "85BA000B", true); // Keep classification