У меня есть Java программа, которая вызывает оболочку для вызова PowerShell со сценарием.
Моя строка сценария PS выглядит следующим образом:
execPS:powershell -command "& 'P:/PSScripts/DownloadSslHtml.ps1' -url 'https://somewebsite.com' -outputFile 'P:/DownloadedData/SomeFile.zip' -PFXPath 'P:/Properties/Config/certfile.pfx' -PFXPassword 'cert_password'"
Рассматриваемый сценарий PS имеет следующий код:
param([string]$url = "https://somewebsite.com",
[string]$outputFile = "P:/DownloadedData/someoutput.html",
[string]$PFXPath = "P:/Properties/Config/certfile.pfx",
[string]$PFXPassword = "cert_password")
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import($PFXPath,$PFXPassword,'UserKeySet')
Invoke-WebRequest -Uri $url -Certificate $cert -OutFile $outputFile -Verbose
Как видите, все довольно просто.
Мой Java вызов оболочки выглядит так:
public static String downloadSslWithPshell(String url, String outputFileName, String certName,
String password, boolean waitFor){
String res = "";
try {
ConfigStore configStore = ConfigStore.getInstance();
String driveLetter = configStore.getDriveFor514();
String execPS = "powershell -command \"& '" + driveLetter + "PSScripts/DownloadSslHtml.ps1' -url '"
+ url + "' -outputFile '" + outputFileName + "' -PFXPath '"
+ certName + "' -PFXPassword '" + password + "'\"";
System.out.println("execPS:" + execPS);
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(execPS);
if(waitFor) {
try {
int resultCode = proc.waitFor();
if (resultCode == 0) {
System.out.println("Script run without errors!");
}
} catch (InterruptedException ex) {
Logger.getLogger(WebManagement.class.getName()).log(Level.SEVERE, null, ex);
}
}
//from experience we need to put a pause to let it run
try {
TimeUnit.MILLISECONDS.sleep(1600);
} catch (InterruptedException ex) {
Logger.getLogger(WebManagement.class.getName()).log(Level.SEVERE, null, ex);
}
String line;
InputStream errStream = proc.getErrorStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(errStream));
int countError = 0;
String strError = "";
while ((line = reader.readLine()) != null) {
countError++;
if(countError<=2){
strError = strError+line;
}
}
proc.getOutputStream().close();
if(countError== 0){
res = "200";
} else {
res = strError;
}
} catch (IOException ex) {
Logger.getLogger(WebManagement.class.getName()).log(Level.SEVERE, null, ex);
}
return res;
}
Вот что случается: 95% времени программа продолжает выполнять скрипт PowerShell и успешно загружает файл за вызов. Однако примерно в 5% случаев я получаю это сообщение об ошибке:
&: Файл P: \ PSScripts \ DownloadSsl Html .ps1 не может быть загружен, так как в этой системе отключены запущенные сценарии. Для получения дополнительной информации см. About_Execution_Policies по адресу https: / go .microsoft.com / fwlink /? LinkID = 135170.
Для меня это не имеет особого смысла. У меня есть разрешения на запуск сценариев PS на моей машине, и если я запускаю сценарий вручную из PS GUI, он работает нормально. Это периодически возникающая проблема, которая, по-видимому, возникает периодически и никогда не происходит постоянно.
Мне интересно, может ли это быть проблемой Active Directory или проблемой сети, когда система не может получить политику? Просто мысль, я действительно понятия не имею, почему я получаю эту ошибку. Мысли? Я добавил «-ExecutionPolicy Bypass» к аргументам команды PS, поэтому, думаю, посмотрим, поможет ли это.