Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
4 / 4 / 0
Регистрация: 26.10.2010
Сообщений: 8

Вызов runas через командную строку windows

26.10.2010, 13:58. Показов 3844. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть вот такой код:

Java
1
2
3
4
5
6
7
8
9
String commands [] = new String [] { "CMD.EXE","/C","runas"};
Process p=Runtime.getRuntime().exec(commands);
 
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null)
    System.out.println(line);
BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((line = error.readLine()) != null)
    System.out.println(line);

Нужно, чтобы на экран выводилось то же самое, что выводит сама винда при вводе runas в консоль, однако на экран выводится только пустая строка. При этом с остальными командами, которые я пробовал, проблем не возникало.
Например, обычный хэлп:
Java
1
String commands [] = new String [] { "CMD.EXE","/C","help"};
или создание новой учётной записи в системе:
Java
1
String commands [] = new String [] { "CMD.EXE","/C","net user test test /add"};
и т.д.
В чём может быть проблема?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.10.2010, 13:58
Ответы с готовыми решениями:

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

Работа с архивами через Командную строку Windows
Друзья, помогите пожалуйста, не особо понимаю как работать с этими архивами, дали лабу, не осиляю. 1.Создать архив файлов в каталог с...

Восстановление windows 2008 через командную строку
У меня на ПК сделан backup сервера стандартными средствами, который по умолчанию сохраняется на диске D:\WindowsImageBackup\Serv В этой...

8
1 / 1 / 0
Регистрация: 11.10.2010
Сообщений: 22
26.10.2010, 14:47
тоже попробовал - потоки молчат, однако если ввести пользователя и программу - запрос пароля выводит в стандартный поток.
1
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
26.10.2010, 18:52
Во первых, читать stdout и strerr запускаемых программ нужно в отдельном потоке. А вот с записью в stdin запускаемой программы получаются проблемы...
0
4 / 4 / 0
Регистрация: 26.10.2010
Сообщений: 8
27.10.2010, 17:31  [ТС]
Цитата Сообщение от aleksandy Посмотреть сообщение
Во первых, читать stdout и strerr запускаемых программ нужно в отдельном потоке. А вот с записью в stdin запускаемой программы получаются проблемы...
Так я и так потоки out и err читаю в разных потоках.


А возможно ли вообще вызвать runas со всеми параметрами и отправить ему пароль в ответ на его запрос?
т.е. к примеру мне нужно выполнить что-то вроде
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
try{
            String  commands [] = new String [] { "CMD.EXE","/C",
                    "runas /profile /user:username \"notepad C:\\1.txt\""};
            Process p=Runtime.getRuntime().exec(commands);
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            BufferedOutputStream output = new BufferedOutputStream(p.getOutputStream()); 
            int exitVal=p.waitFor();
            String line;
            while ((line = input.readLine()) != null) 
                System.out.println(line);            
            while ((line = error.readLine()) != null) 
                System.out.println(line);
            line="password";
            byte[] b=line.getBytes();
            output.write(b, 0, b.length);
            output.flush();
            System.out.println(exitVal);
        }
        catch(Throwable e){e.printStackTrace();}
В ответ мне выбрасывается

Введите пароль для username:
java.io.IOException: Идет закрытие канала
at java.io.FileOutputStream.writeBytes(Nati ve Method)
at java.io.FileOutputStream.write(FileOutpu tStream.java:260)
at java.io.BufferedOutputStream.flushBuffer (BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(Buffe redOutputStream.java:123)
at java.io.BufferedOutputStream.flush(Buffe redOutputStream.java:124)
at cmd.myRuntime.doit(myRuntime.java:62)
at cmd.Main.main(Main.java:30)

Кроме того, мне было бы просто интересно сделать что-то типа bat-файла.
К примеру заменить в предыдущем куске кода две строчки на
Java
1
String  commands [] = new String [] { "CMD.EXE","/C","echo hello"};
и
Java
1
line="echo hello";
и получить в ответ два hello на экране, но программа выводит одно hello и после этого так же падает.
Возможно ли это сделать?
0
1 / 1 / 0
Регистрация: 11.10.2010
Сообщений: 22
02.11.2010, 12:07
А просветите, пожалуйста, почему:
Java
1
String  commands [] = new String [] { "CMD.EXE","/C","echo hello"};
а не просто:
Java
1
String  commands [] = new String [] { "echo hello"};
?
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
02.11.2010, 14:18
Цитата Сообщение от MrCarp Посмотреть сообщение
Так я и так потоки out и err читаю в разных потоках.
И где ты это делаешь? В упор не вижу...

Поясняю для тех, кто на бронепоезде. Код, который ты привел под цитируемым мною текстом, делает следующее: с 6 по 8 строки ты создаешь читателей потоков. В 9 строке говоришь программе, что нужно дождаться завершения процесса p. По окончании процесса ты пытаешься что-то прочитать-записать в его стандартные потоки, что, естественно, приводит к ошибке, т.к. эти потоки закрываются после завершения процесса. Учи матчасть...
1
1 / 1 / 0
Регистрация: 11.10.2010
Сообщений: 22
03.11.2010, 11:45
Цитата Сообщение от aleksandy Посмотреть сообщение
В 9 строке говоришь программе, что нужно дождаться завершения процесса p. По окончании процесса ты пытаешься что-то прочитать-записать в его стандартные потоки, что, естественно, приводит к ошибке, т.к. эти потоки закрываются после завершения процесса. Учи матчасть...
а можно, если не трудно, как бы Вы это написали. Просто сам сейчас с потоками разбираюсь. В нете много теории, так что голова пухнет, а вот увидеть бы работающий примет - должно быть понятнее.

PS: получается бага в терминологии? потоки - это потоки ввода-вывода, и потоки - нити программы, процессы?
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
03.11.2010, 13:20
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class InputToOutputStream extends Thread {
 
    private final InputStream is;
    private final OutputStream os;
    private boolean interrupted;
 
    public InputToOutputStream(ThreadGroup tg, InputStream is, OutputStream os) {
        super(tg, tg.getName());
        if (is == null || os == null) {
            throw new IllegalArgumentException();
        }
        this.is = is;
        this.os = os;
    }
 
    @Override
    public void run() {
        byte[] buf = new byte[256];
        try {
            // we don't use interrupted() for a performance reason
            while (!interrupted) {
                if (is.available() > 0) {
                    int n = is.read(buf, 0, buf.length);
                    os.write(buf, 0, n);
                    os.flush();
                }
                yield();
            }
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }
 
    @Override
    public void interrupt() {
        interrupted = true;
        super.interrupt();
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) throws Exception {
    ThreadGroup group = new ThreadGroup("External process IO");
    try {
        Process proc = Runtime.getRuntime().exec("cmd.exe");
        new InputToOutputStream(group, proc.getInputStream(), System.out).start();
        new InputToOutputStream(group, proc.getErrorStream(), System.err).start();
        new InputToOutputStream(group, System.in, proc.getOutputStream()).start();
        int ret = proc.waitFor();
        System.out.println("Return code: " + ret);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        group.interrupt();
    }
}
1
1 / 1 / 0
Регистрация: 11.10.2010
Сообщений: 22
19.11.2010, 16:45
что-то мне пока знаний не хватает, чтобы в Вашем примере разобраться.
там, где группа процессов запускается - вроде понятно, а вот то, что происходит внутри этих самых нитей - не очень понял. можно алгоритм?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2010, 16:45
Помогаю со студенческими работами здесь

Ошибка при сбросе пароля windows 7 (через командную строку)
Приветствую всех. Сразу оговорюсь, что я обычный пользователь с минимальными знаниями. Просто я нигде не смог найти ответа который бы...

Скопировать установочные файлы для Windows 7 через командную строку
не могу скопировать устоновочные файлы для виндовс 7 через командную строку с флеш накопителя на хард почему при вводе команды xcopy...

Как сделать флешку установочной через Командную строку Windows?
Всем доброго времени суток. Мне такую задачу дали что надо сделать так чтобы при подключении флешки к компютеру с неё автоматически на комп...

Не работает программа при запуске в Windows через командную строку
Дали задание скомпилить cmake под Linux. Там все получилось. Как доп.задание дали перенести и скомпилить cmake на windows через командную...

Как через командную строку (Windows XP) открыть файл в программе WordPad?
Открыть файл через командную строку Код: C:\file.txt , но он откроется через программу, установленную по умолчанию в свойствах (у...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru