从VBScript发送Outlook邮件时如何避免Outlook安全警报?

时间:2013-02-15 16:14:09

标签: vbscript outlook security-warning

我遇到这种情况:

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

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

我已经尝试了this有用网站上的所有内容,并按照以下方式删除了每个选项:

  

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

这是完全我最终做的事情(请参阅下面的答案),这就是为什么该页面上的所有其他选项都无关紧要的原因。让我们逐一介绍它们:

  

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

SMTP。 NO-GO。网络政策不允许。

  

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

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

  

对于可能触发安全提示的所有代码,请使用第三方库 - Redemption或MAPI33。这种方法比使用扩展MAPI更容易,扩展MAPI具有陡峭的学习曲线,几乎同样安全。这些库还提供了其他功能来帮助Outlook代码项目。

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

  

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

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

  

对于Outlook 2007,请确保计算机正在运行最新的防病毒应用程序,并使用Outlook对象执行所有编码,从而避免使用CDO 1.21和简单MAPI代码。

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

  

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

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

  

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

繁琐:安装COM加载项需要管理访问权限,而某些组织的管理访问权限很难实现。

  

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

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

  

在企业环境中,管理员可以选择放宽部分或全部用户的Outlook安全性。

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

2 个答案:

答案 0 :(得分:9)

此代码适用于我的Outlook 2010系统,用于发送没有用户交互的电子邮件。它是略微脆弱,因为,如果用户恰好在编写邮件时正在系统上工作(打字,点击),可能会发生用户输入进入弹出的窗口一瞬间,或者干扰发送邮件,或者在邮件正文中添加额外的未知字符。

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

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

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

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

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提升的情况下以尽可能高的完整性级别运行(如果您不是管理员帐户,则为“中”)。

windows task scheduler properties

答案 1 :(得分:0)

一些选择:

  1. 最新的防病毒软件(Outlook不会显示提示)
  2. 扩展MAPI(C ++或Delphi,不适用于VB脚本)。但是,您可以使用类似Redemption的包装器,它使用扩展MAPI,但可以从任何语言(包括VBS)访问。
  3. ClickYes这样的产品。
  4. 有关讨论和可用选项列表,请参阅http://www.outlookcode.com/article.aspx?id=52