случайная ошибка разрешения Windows при вызове PowerShell из Java - «запуск сценариев отключен» - PullRequest
7 голосов
/ 31 января 2020

У меня есть 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, поэтому, думаю, посмотрим, поможет ли это.

1 Ответ

1 голос
/ 07 февраля 2020

Если вы используете команду:

Get-ExecutionPolicy -List

Вы увидите, что есть несколько уровней областей, каждый из которых может иметь собственную политику выполнения, хотя я не уверен, почему ваши результаты настолько противоречивы, я подозреваю возможно, это связано с тем, что ваша политика CurrentUser не определена. Попробуйте выполнить команду

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...