运行 来自不同安全上下文的 VBS 脚本
Run VBS script from different security contexts
我想从我的 java 应用程序自动创建新电子邮件。为此,我正在生成一个 VBS 脚本,它将收集所有信息(电子邮件内容、主题、附件等),并将生成 VBS 脚本,该脚本将从 outlook 打开一个新的电子邮件视图,所有字段都正确。(我不'想自动发送邮件,只是想在 outlook 客户端中创建一个新邮件。)下面你可以看到我如何 运行 来自 java APP 的脚本:
Runtime.getRuntime().exec("wscript " + nameOfScript);
我的 Java 应用一直 运行 具有管理员权限。
当用户使用管理员权限打开 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
似乎是因为我运行使用管理员权限设置脚本,如果 outlook 运行设置没有管理员权限,GetObject 函数将始终失败。
是否有解决此问题的方法。
在此先感谢您的帮助!
根据您的评论和错误信息,很难指出导致问题的原因。我想提供一些建议如下:
该对象在计算机上可用,但它是许可的自动化对象,无法验证实例化它所需的许可证的可用性。
有些对象只有在组件找到许可证密钥后才能实例化,许可证密钥验证该对象是否已在当前机器上注册以进行实例化。当通过正确安装的类型库或对象库引用对象时,会自动提供正确的键。
如果实例化尝试是 CreateObject 或 GetObject 调用的结果,则对象必须找到键。在这种情况下,它可能会搜索系统注册表或查找它在安装时创建的特殊文件,例如扩展名为 .lic 的文件。如果找不到密钥,则无法实例化对象。如果最终用户不正确地设置了对象的应用程序、无意中删除了必要的文件或更改了系统注册表,则对象可能无法找到其密钥。如果找不到密钥,则无法实例化对象。在这种情况下,实例化可能在开发人员的系统上工作,但在用户的系统上却不行。用户可能需要重新安装许可对象。
您正在尝试使用 GetObject 函数检索对使用 Visual Basic 创建的 class 的引用。
GetObject 不能用于获取对使用 Visual Basic 创建的 class 的引用。
对该对象的访问已被明确拒绝。例如,您可能正在尝试访问当前正在使用并被锁定以防止出现死锁情况的数据对象。如果是这种情况,您也许可以在其他时间访问该对象。
更多信息,请参考以下链接:
Run-time error '429': ActiveX component can't create object
Run-Time error 429 when using GetObject (,"Outlook.Application")
你可以使用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 window
我想从我的 java 应用程序自动创建新电子邮件。为此,我正在生成一个 VBS 脚本,它将收集所有信息(电子邮件内容、主题、附件等),并将生成 VBS 脚本,该脚本将从 outlook 打开一个新的电子邮件视图,所有字段都正确。(我不'想自动发送邮件,只是想在 outlook 客户端中创建一个新邮件。)下面你可以看到我如何 运行 来自 java APP 的脚本:
Runtime.getRuntime().exec("wscript " + nameOfScript);
我的 Java 应用一直 运行 具有管理员权限。
当用户使用管理员权限打开 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
似乎是因为我运行使用管理员权限设置脚本,如果 outlook 运行设置没有管理员权限,GetObject 函数将始终失败。
是否有解决此问题的方法。
在此先感谢您的帮助!
根据您的评论和错误信息,很难指出导致问题的原因。我想提供一些建议如下:
该对象在计算机上可用,但它是许可的自动化对象,无法验证实例化它所需的许可证的可用性。
有些对象只有在组件找到许可证密钥后才能实例化,许可证密钥验证该对象是否已在当前机器上注册以进行实例化。当通过正确安装的类型库或对象库引用对象时,会自动提供正确的键。
如果实例化尝试是 CreateObject 或 GetObject 调用的结果,则对象必须找到键。在这种情况下,它可能会搜索系统注册表或查找它在安装时创建的特殊文件,例如扩展名为 .lic 的文件。如果找不到密钥,则无法实例化对象。如果最终用户不正确地设置了对象的应用程序、无意中删除了必要的文件或更改了系统注册表,则对象可能无法找到其密钥。如果找不到密钥,则无法实例化对象。在这种情况下,实例化可能在开发人员的系统上工作,但在用户的系统上却不行。用户可能需要重新安装许可对象。
您正在尝试使用 GetObject 函数检索对使用 Visual Basic 创建的 class 的引用。 GetObject 不能用于获取对使用 Visual Basic 创建的 class 的引用。
对该对象的访问已被明确拒绝。例如,您可能正在尝试访问当前正在使用并被锁定以防止出现死锁情况的数据对象。如果是这种情况,您也许可以在其他时间访问该对象。
更多信息,请参考以下链接:
Run-time error '429': ActiveX component can't create object
Run-Time error 429 when using GetObject (,"Outlook.Application")
你可以使用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 window