Запустите VBS скрипт из разных контекстов безопасности - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу автоматизировать создание нового электронного письма из моего Java-приложения.Для этого я создаю сценарий VBS, который будет собирать всю информацию (содержимое электронной почты, тема, вложения и т. Д.), И он создаст сценарий VBS, который откроет новое представление электронной почты из внешнего вида со всеми полями правильно.не хочу автоматически отправлять электронную почту, просто хочу создать новую почту в клиенте Outlook.) Ниже вы можете увидеть, как я запускаю сценарий из приложения Java:

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

Все время моя JavaПриложение запускается с правами администратора.Когда у пользователя есть приложение Outlook, открытое с правами администратора, все работает нормально.
Когда у пользователя приложение Outlook открывается без прав администратора, сценарий больше не будет работать.В следующей строке произойдет сбой:

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

Похоже, что из-за того, что я запускаю сценарий с привилегиями администратора, функция GetObject всегда завершится ошибкойесли outlook работает без прав администратора.

Есть ли решение для этой проблемы.

Заранее благодарен за помощь!

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы можете использовать службу runas из Windows, и ваша команда станет такой:

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();
           }
       }

Что вы можете сделать:

  • написать.bat файл с командой runas, указанной выше, выполняет его и позволяет пользователю
  • вставить свой пароль в окно cmd
0 голосов
/ 29 ноября 2018

Исходя из вашего комментария и сообщения об ошибке, трудно указать причину, по которой возникла проблема.Я хотел бы предоставить следующие предложения:

  1. Объект доступен на компьютере, но является лицензированным объектом автоматизации и не может проверить наличие лицензии.необходимо создать экземпляр этого.

    Некоторые объекты могут быть созданы только после того, как компонент найдет лицензионный ключ, который проверяет, что объект зарегистрирован для создания экземпляра на текущем компьютере.Когда делается ссылка на объект через правильно установленную библиотеку типов или библиотеку объектов, правильный ключ предоставляется автоматически.

    Если попытка создания экземпляра является результатом вызова CreateObject или GetObject, объект должен найти ключ.В этом случае он может выполнять поиск в системном реестре или искать специальный файл, который он создает при установке, например, файл с расширением .lic.Если ключ не может быть найден, объект не может быть создан.Если конечный пользователь неправильно настроил приложение объекта, непреднамеренно удалил необходимый файл или изменил системный реестр, объект может не найти свой ключ.Если ключ не может быть найден, объект не может быть создан.В этом случае создание экземпляра может работать в системе разработчика, но не в системе пользователя.Пользователю может потребоваться переустановить лицензированный объект.

  2. Вы пытаетесь использовать функцию GetObject для получения ссылки на класс, созданный с помощью Visual Basic.GetObject нельзя использовать для получения ссылки на класс, созданный с помощью Visual Basic.

  3. Доступ к объекту явно запрещен.Например, вы можете пытаться получить доступ к объекту данных, который используется в данный момент и заблокирован для предотвращения тупиковых ситуаций.Если это так, вы можете получить доступ к объекту в другое время.

Для получения дополнительной информации перейдите по следующим ссылкам:

Ошибка времени выполнения '429': компонент ActiveX не может создать объект

Ошибка времени выполнения 429 при использовании GetObject (, "Outlook.Application")

...