Но мое личное предложение было бы избегать 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".
Но он выдает разные исключения / ошибки с двумя разными подходами.
Я попробовалосновной способ выполнения команд powershell, а затем передать команду в качестве аргумента. Это не сработало, привело к другой ошибке, описанной ниже.
Далее я попробовал использоватьБиблиотека jPowerShell (професорфалкен) без удачи снова. Проверьте ошибку в последнем
Код для первой попытки:
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"} - Сервер a.b.c.d: 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 --Manual.Rirect.Rec. 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"} - Сервер a.b.c.d: 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, с которым у меня мало опыта.
РЕДАКТИРОВАТЬ: ПослеМатиас Р. Ессен ответ, я не получаю никакой ошибки во втором случае; но, похоже, сама библиотека не соответствует действительности.
Итак, говоря о первом методе, я получаю ошибку, как упоминалось в первом случае. Я хочу продолжить только первый метод!
Я почти потерял веру во внешний JAR-файл jPowershell. Я не получаю ошибку во 2-м выводе; но, ни получая результат. Он ведет себя так, как будто нет вывода команды!
Просьба любезно помочь мне решить эту проблему!