【问题标题】:How to avoid Outlook Security Alert when sending Outlook message from VBScript?从 VBScript 发送 Outlook 消息时如何避免 Outlook 安全警报?
【发布时间】:2013-01-31 16:01:03
【问题描述】:

我有这种情况:

  • 代码必须在 VBScript 中(我无法控制)
  • 无法在 Outlook 首选项中禁用编程访问限制(组策略,而不是管理员,并且 Windows 无法识别已安装的有效病毒扫描程序)
  • 无法使用 SMTP,因为它被禁止。

我认为没有方法可以使用 Outlook 以自动方式发送电子邮件(在无人看管的盒子上以用户身份登录并锁定屏幕)。我尝试了许多不同的方法,但总是会收到安全警告消息。我该如何解决这个问题?

我已经在 this 有用的网站上尝试了所有方法,并消除了每个选项,如下所示:

策略
理想情况下,自动化 Outlook 的应用程序应该避免触发这些安全提示的代码。

正是我最终做了什么(请参阅下面的答案),这就是为什么该页面上的所有其他选项都不相关的原因。让我们一一来看:

发送消息
如果您的目标只是创建和发送电子邮件,则根本不需要使用 Outlook 对象。 Microsoft 提供了用于使用 SMTP 创建和发送消息的 CDO for Windows 库。使用此库完全绕过 Outlook 和 MAPI,并且不会触发安全提示。有关代码示例,请参阅...

SMTP。不行。网络政策不允许。

对所有可能触发安全提示的代码使用扩展 MAPI 而不是 Outlook 对象、简单 MAPI 或 CDO 1.21。

扩展的 MAPI 可能会起作用,但它非常繁琐和冗长,并且涉及大量 C/C++ 代码(这不是本问题的主题;见上文),并且在不提示用户的情况下似乎无法使用它他们的密码。

对所有可能触发安全提示的代码使用第三方库(Redemption 或 MAPI33)。这种方法比使用扩展 MAPI 更容易,后者具有陡峭的学习曲线,并且几乎同样安全。这些库还提供额外的功能来帮助处理 Outlook 代码项目。

第三方库的问题有四个方面: - 他们花钱; - 即使它们是免费的,它们也会引入许可问题(一些组织在允许软件进入生态系统之前需要律师的广泛审查); - 整个问题甚至令人担忧的大多数环境是用户无法在 Outlook 选项中禁用编程访问警告的环境。嗯,那些可能的情况是什么?会不会是……企业环境?在企业环境中采购软件需要很长时间,以至于不切实际,除非使用它所节省的成本将超过数百万美元。但是,可以进行许多实际的流程改进,这些改进不会产生那么高的成本节约,但如果需要软件采购,采购第三方软件所花费的金钱和劳动力将超过总节约成本。 - 网络管理员可能不信任该软件驻留在系统上,因为它可能被用于恶意目的。

为您的应用程序部署一个工具来抑制安全提示。

这假设 抑制 OMG 提示是必要的,在我的情况下,它不是,只是发送一封简单的电子邮件(请参阅我的回答)。

对于 Outlook 2007,确保机器运行最新的防病毒应用程序并使用 Outlook 对象进行所有编码,避免使用 CDO 1.21 和简单 MAPI 代码。

病毒扫描程序是最新的,但我完全无法控制更改其版本或供应商,并且 Outlook 无法识别它。它说:“防病毒状态:无效。此版本的 Windows 支持防病毒检测,但未找到防病毒。”

在 Outlook 自定义表单代码、Outlook VBA 代码和 COM 加载项中,从 VBA 或加载项体系结构提供的 Outlook.Application 对象派生所有对象。例如,请参阅下面的示例 VBA“运行脚本”规则过程。

有趣,可能有用,但不是必需的。这对在 Outlook 中设置规则以部署软件产生了不必要的依赖,这使部署变得复杂。

部署“信任”某些 COM 加载项或允许所有应用程序不受限制地访问某些功能(例如访问地址)的 Outlook 安全设置。在 Outlook 2007 之前的版本中,这需要 Microsoft Exchange Server。对于 Outlook 2007,请参阅下面关于版本特定注意事项的部分。

繁琐:安装 COM 插件需要管理权限,而在某些组织中很难通过管理权限获得。

在以 Exchange 为电子邮件服务器的企业环境中,可以通过从 Exchange 2000 开始的 WebDAV API 以及从 Exchange 2007 开始通过 Exchange Web 服务直接访问服务器上的数据。

在我的环境中禁用,可能在其他环境中。

在公司环境中,管理员可以选择为部分或所有用户放松 Outlook 安全性。

当然可以,但这需要与网络团队进行沟通/协调/合作。如果管理访问权限不可用于安装 COM 插件,则可能也无法用于放松组策略。

【问题讨论】:

  • 我想Outlook Redemption,它是免费的,会比 sendkeys 安全得多,它可能不适用于所有环境,通常被认为是最后的解决方案。
  • 更安全更可靠?是的,对于必须分发的东西。但是在具有固定的、众所周知的静态配置的盒子上,这很好。此外,在我的环境中获取和部署 Redemption 的阻力(因为它需要花钱)完全抵消了任何潜在的收益。
  • 兑换可免费用于非商业用途。对于商业环境,使用 sendkeys 对帖子进行灾难性添加的可能性似乎太大了,不能冒险。

标签: vbscript outlook security-warning


【解决方案1】:

此代码在我的带有 Outlook 2010 的系统上运行,无需用户交互即可发送电子邮件。 有点脆弱,因为如果用户在撰写邮件时碰巧在系统上积极工作(打字、点击),则可能会发生用户输入进入弹出窗口的情况一会儿,要么干扰邮件的发送,要么在邮件正文中添加额外的未知字符。

只要在其系统上运行此功能的用户意识到这一点,并且虚假击键干扰的潜在后果不是关键业务,此功能是可以接受的。

需要注意的是:这个解决方案的关键是我们不调用MailItem.Send方法。这是触发程序访问保护的方法。相反,我们触发 ALT+s 快捷方式,默认情况下,当邮件窗口在 Outlook 中具有焦点时,按下“发送”按钮。如果您启用了默认的拼写检查提示,则会弹出进一步的拼写检查提示。我们的解决方案是禁用拼写检查提示,尽管我相信您可以添加更多的 SendKey 来点击它,因为拼写检查提示不是与安全相关的对话框。

关于 UIPI(用户界面特权隔离)的说明:

Outlook 2010 以登录系统的用户身份运行,具有 完整性级别。由 Windows 资源管理器启动的程序,或作为以类似方式启动的程序的子程序或后代启动的程序,也将以 Medium 完整性级别启动。 UIPI 对防止“SendKeys”类型输入无效,只要用户和会话 ID 匹配,并且完整性级别相同或更高。在我的特定环境中,用户和会话 ID 是相同的,并且 VBScript 宿主进程和 Outlook 进程的完整性级别相同。在您的环境中,如果这些条件中的任何一个为假,则此代码将不起作用。它也未在比 2010 版本更早或更高版本的 Office 上进行测试。

Sub SendEmail_Outlook()
    Set WshShell = WScript.CreateObject("WScript.Shell")
    Set ol=CreateObject("Outlook.Application") 
    Set Mail=ol.CreateItem(0) 
    Mail.to= "you@example.com"
    Mail.Subject = "test"
    Mail.HTMLBody = "test"
    Mail.Display    
    WshShell.SendKeys "%s"
    Set Mail = Nothing 
    Set ol = Nothing 
End Sub

SendEmail_Outlook

此外,这里是从 Windows 任务计划程序运行 VBScript 时如何使这项工作。只需勾选红色椭圆所描绘的框“以最高权限运行”,以使其在没有 UAC 提升的情况下以尽可能高的完整性级别运行(如果您不是管理员帐户,则为“中”)。

【讨论】:

    【解决方案2】:

    几个选项:

    1. 最新的防病毒软件(届时 Outlook 不会显示提示)
    2. 扩展 MAPI(C++ 或 Delphi,不适用于 VB 脚本)。但是,您可以使用像 Redemption 这样的包装器,它使用扩展 MAPI,但可以从包括 VBS 在内的任何语言访问。
    3. 类似ClickYes的产品。

    有关讨论和可用选项列表,请参阅 http://www.outlookcode.com/article.aspx?id=52

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2011-01-19
      • 1970-01-01
      相关资源
      最近更新 更多