使 OpenMsgStore 失败的数据丢失防护策略 (0x80040312)

Data Loss Prevention policy making OpenMsgStore fail (0x80040312)

启用 DLP 策略后,兑换失败并出现错误: “所有商业电子邮件都根据您组织中设置的策略受到保护。打开受保护的电子邮件时出错。”

ulLowLevelError:2147746578(即 0x80040312)
ulContext: 805701633 (0x30060801)

有什么解决办法吗?

尝试访问 Store 对象的 IPMRootFolder 属性 时发生错误:

// A previous version of the code was multi-threaded, it is no longer.
Session = OutlookRpcLoader.new_RDOSession();
Session.Logon(ProfileName: profile, ShowDialog: false, NewSession: true);
var stores = Session.Stores;
var store = stores["{STORE-NAME}"];
var root = store.IPMRootFolder;

调用堆栈显示 Redemption.IRDOStore.get_IPMRootFolder() 引发了异常。

编辑

这是在使用通过 .NET(无注册 COM)中的 RedemptionLoader class 加载的 Redemption 版本 5.22.0.5498 时看到的。
使用 CreateObject() 从 VBScript 使用 Redemption 版本 5.19.0.5238 进行测试时,不会发生错误。
v5.19 和 v5.22 之间有什么变化吗?

首先,你需要检测你的代码在哪里运行——是前台线程还是后台线程。我建议检查进程的 ThreadID。前台线程的值设置为 1。所有后台线程的值都将大于 1。如果它是辅助线程,您需要在要使用的辅助线程上创建一个新的 Redemption 会话,并将 MAPIOBJECT 属性 设置为从主线程检索的对象。例如,VB.NET 中的原始草图:

Dim PrimaryRDOSession As New Redemption.RDOSession()
PrimaryRDOSession.Login([...])
Dim WorkerThread as New System.Threading.Thread(AddressOf ThreadProc)
WorkerThread.Start(PrimaryRDOSession.MAPIOBJECT)

Sub ThreadProc(ByVal param as Object)
    Dim ThdRDOSession As New Redemption.RDOSession()
    ThdRDOSession.MAPIOBJECT = param
    ' do other stuff
End Sub

如果您在辅助线程上,请不要使用在主线程上创建的对象。确保您在使用对象时保持一致。

我认为这是由 AppLocker 规则阻止未签名的二进制文件引起的。解决方案是对文件进行代码签名或将程序添加到 AppLocker 允许列表。