Выполнение связанной с ADS команды Powershell через Java не работает, выдавая 2 разных ошибки при использовании 2 разных способов

Я пытался выполнить набор команд в сеансе PowerShell через Java, но пока не повезло. Моя цель заключается в поиске компьютерного объекта в AD с помощью domain = "domain.com".

Я начал с одной команды. К сожалению, в моей команде powershell успешно выполняется следующая команда:

Get-ADComputer -Filter { Name -like "hostname" } –Server a.b.c.d:3268 -SearchBase 'DC=domain,DC=com' | FT DNSHostName
# hostname is actual hostname provided by user and accepted in argument of Java methods
# a.b.c.d is the IP-Address of my domain controller, and I'm trying to search a computer object in AD with the domain = "domain.com".

Но он выдает разные исключения / ошибки с двумя разными подходами.

  1. Я попробовал основной способ выполнения команд powershell, а затем передавал команду в качестве аргумента. Это не сработало, привело к другой ошибке, описанной ниже.

  2. Затем я попытался использовать библиотеку jPowerShell (profesorfalken), но безуспешно. Проверьте ошибку в последнем


Код для первой попытки:

public String executeCommand(String hostname){
        String output = "";
        try{
//          String firstPartCommand = "Get-ADComputer -Filter { Name -like (", secondPartCommand = ") } –Server a.b.c.d:3268 -SearchBase 'DC=domain,DC=com' | FT DNSHostName"; 
            String firstPartCommand = "Get-ADComputer -Filter { Name -like \""+hostname+"\" } –Server a.b.c.d:3268 -SearchBase \'DC=domain,DC=com\' | FT DNSHostName"; 

            Runtime rt = Runtime.getRuntime();
            String[] cmds = new String[]{
                "powershell.exe", firstPartCommand.trim()
            };
            System.out.println(firstPartCommand);

            Process pr = rt.exec(cmds);
            pr.getOutputStream().close();
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(pr.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(pr.getErrorStream()));

            System.out.println("Here is the standard output of the command:\n");
            String s = null;
            while ((s = stdInput.readLine()) != null) {
            System.out.println(s+" -> OUTPUT");
            output+=s;
            //displayTF.setText(s);
            }
            stdInput.close();
            System.out.println("Here is the standard error of the command (if any):\n");
            while ((s = stdError.readLine()) != null) {
            System.out.println(s+" -> ERROR");
            }
            stdError.close();
            return output;
        }
        catch(Exception ex){
            ex.printStackTrace(System.out);
            output = "Some exception occured, SORRY!";
            return output;
        }
    }

Выход:

Get-ADComputer -Filter {Name-like "hostname"} - Сервер abcd:3268 -SearchBase 'DC= домен,DC=com' | FT DNSHostName

Вот стандартный вывод команды:

Вот стандартная ошибка команды (если есть):

Get-ADComputer: Ошибка разбора запроса: "Name -like hostname" Сообщение об ошибке: "синтаксическая ошибка" в позиции: "13". -> ОШИБКА В строке:1 символ:1 -> ОШИБКА + Get-ADComputer -Filter {Имя -подобное имя хоста} -Server abcd ... -> ОШИБКА + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -> ОШИБКА + CategoryInfo: ParserError: (:) [Get-ADComputer], ADFilterParsingException -> ОШИБКА + FullyQualifiedErrorId: ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADFilterParsingException,Micr --Mirectory.Oction. ERR.GetADComputer -> ОШИБКА -> ОШИБКА


Код для второй попытки:

public String execute(String hostname){
        String output = "";
        PowerShell powershell = null;
        try{            
            powershell = PowerShell.openSession();
//            String cmd = "$variable = \""+hostname+"\"";
//            //Execute a command in PowerShell session
//            PowerShellResponse response = powershell.executeCommand(cmd);
//            //Print results
//            System.out.println("Variable Initialisation:" + response.getCommandOutput());
            String firstPartCommand = "Get-ADComputer -Filter { Name -like \"", secondPartCommand = "\" } –Server 10.0.239.236:3268 -SearchBase 'DC=AD,DC=SBI' | FT DNSHostName"; 
            String finalCommand = firstPartCommand+hostname+secondPartCommand;
            System.out.println(finalCommand);
            PowerShellResponse response = powershell.executeCommand(finalCommand);
            //PowerShellResponse response = powershell.executeCommand("Get-Process powershell -FileVersionInfo");
            output = response.getCommandOutput();
            System.out.println("Search result: "+hostname+"\n" + output);
            return output;
        }
        catch(Exception ex){
            return "Failed!";
        }
        finally {
       //Always close PowerShell session to free resources.
            if (powershell != null)
                powershell.close();
        }
    }

Выход:

Get-ADComputer -Filter {Name-like "hostname"} - Сервер abcd:3268 -SearchBase 'DC= домен,DC=com' | FT DNSHostName

Результат поиска: имя хоста

Get-ADComputer: не найден позиционный параметр, который принимает аргумент '-Server'. В строке:1 символ:1 + Get-ADComputer -Filter { Name -like "hostname" } - Сервер abcd ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidArgument: (:) [Get-ADComputer], ParameterBindingException + FullyQualifiedErrorId: PositionalParameterNotFound,Microsoft.ActiveDirectory.Management.Commands.GetADComputer


Из того, что я искал и понял, имя хоста, которое передается методу Java, не рассматривается как строка в powershell. Эти ошибки относятся к powershell, с которым у меня мало опыта.


РЕДАКТИРОВАТЬ: После ответа Mathias R. Jessen я не получаю никакой ошибки во 2-м случае; но, похоже, сама библиотека не соответствует действительности.

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

Я почти потерял веру во внешний JAR-файл jPowershell. Я не получаю ошибку во 2-м выводе; но, ни получая вывод. Он ведет себя так, как будто нет вывода команды!

Просьба любезно помочь мне решить эту проблему!

1 ответ

Решение

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

Правильная команда (для первого случая) должна быть:

String firstPartCommand = "Get-ADComputer -Filter { Name -eq \'"+hostname+"\' } 
-Server a.b.c.d:3268 -SearchBase \'DC=domain,DC=com\' | Select DNSHostName";

Правильная команда (для второго случая) должна быть:

String firstPartCommand = "Get-ADComputer -Filter { Name -eq \'", 
secondPartCommand = "\' }  -Server a.b.c.d:3268 -SearchBase \'DC=domain,DC=com\' |
 Select DNSHostName"; 
Другие вопросы по тегам