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

all*_*tic 5 vbscript outlook security-warning

我有这种情况:

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

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

我已经在这个有用的网站上尝试过所有内容并删除了每个选项,如下所示:

策略
理想情况下,自动化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中设置规则以便部署软件时产生不必要的依赖性,从而使部署变得复杂.

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

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

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

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

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

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

all*_*tic 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
Run Code Online (Sandbox Code Playgroud)

此外,以下是从Windows任务计划程序运行VBScript时如何使此工作.只需勾选红色椭圆形"最高权限运行"所示的框,使其以最高可能的完整性级别运行而不提升UAC(如果您不是管理员帐户,则为"中").

Windows任务调度程序属性