从不同的安全上下文运行VBS脚本

时间:2018-11-28 15:37:22

标签: java windows cmd vbscript outlook

我想从我的Java应用程序自动创建新电子邮件。为此,我正在生成一个VBS脚本,该脚本将收集所有信息(电子邮件内容,主题,附件等),并将生成一个VBS脚本,该脚本将从Outlook中打开一个具有所有正确字段的新电子邮件视图。不想自动发送电子邮件,只想在Outlook客户端中创建新邮件。)下面您可以看到我如何从Java APP运行脚本:

Runtime.getRuntime().exec("wscript " + nameOfScript);

我的Java App始终以Admin Privileges运行。 当用户使用“管理员权限”打开Outlook App应用程序时,一切正常。
当用户打开没有管理员权限的Outlook App应用程序时,该脚本将不再起作用。它将在以下行上失败:

Set Outlook = GetObject(, "Outlook.Application")

错误代码为429-> https://support.microsoft.com/en-ca/help/828550/you-receive-run-time-error-429-when-you-automate-office-applications

似乎因为我正在使用Admin Privileges运行脚本,所以如果Outlook在没有Admin Privileges的情况下运行,则GetObject函数将始终失败。

是否有解决此问题的方法。

在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以从Windows使用runas服务,您的命令将变成这样

String command = "runas /user:"+domain+"/"+user+" \"wscript C:\\Path\\to\\your\\script.vbs\"";

最糟糕的是,runas命令需要用户密码,最糟糕的是,您无法通过Java进程提供该密码。 必须通过键盘输入。

这将不起作用:

       while ((line = is.readLine()) != null)
       {
           System.out.println(line);
           if(line.toLowerCase().matches(".*enter.*password.*"))
           {
               System.out.println("Writing password for the user");
               os.write(password);
               os.write(System.getProperty("line.separator"));
               os.close();
           }
       }

您可以做的是:

  • 使用上述runas命令编写一个.bat文件,执行该文件,然后让
  • 用户将密码插入cmd窗口

答案 1 :(得分:0)

根据您的评论和错误消息,很难指出导致问题的原因。我想提供一些建议如下:

  1. 该对象在计算机上可用,但它是已许可的Automation对象,无法验证实例化它所必需的许可证的可用性。

    某些对象只能在组件找到许可证密钥后才能实例化,该许可证密钥可以验证对象已在当前计算机上注册以进行实例化。通过正确安装的类型库或对象库引用对象时,将自动提供正确的密钥。

    如果实例化的尝试是CreateObject或GetObject调用的结果,则对象必须找到键。在这种情况下,它可能会搜索系统注册表,或者寻找它在安装时创建的特殊文件,例如,扩展名为.lic的文件。如果找不到键,则无法实例化该对象。如果最终用户未正确设置对象的应用程序,无意中删除了必需的文件或更改了系统注册表,则该对象可能找不到其密钥。如果找不到键,则无法实例化该对象。在这种情况下,实例化可能在开发人员的系统上起作用,而在用户的系统上不起作用。用户可能需要重新安装许可的对象。

  2. 您正试图使用​​GetObject函数来检索对使用Visual Basic创建的类的引用。 GetObject不能用于获取对使用Visual Basic创建的类的引用。

  3. 对对象的访问已被明确拒绝。例如,您可能正在尝试访问当前正在使用且已锁定以防止出现死锁情况的数据对象。如果是这种情况,您也许可以在其他时间访问该对象。

有关更多信息,请参阅以下链接:

Run-time error '429': ActiveX component can't create object

Run-Time error 429 when using GetObject (,"Outlook.Application")