4 / 4 / 0
Регистрация: 26.10.2010
Сообщений: 8
1

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

26.10.2010, 13:58. Показов 3530. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2010, 13:58
Ответы с готовыми решениями:

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

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

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

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

8
1 / 1 / 0
Регистрация: 11.10.2010
Сообщений: 22
26.10.2010, 14:47 2
тоже попробовал - потоки молчат, однако если ввести пользователя и программу - запрос пароля выводит в стандартный поток.
1
635 / 527 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
26.10.2010, 18:52 3
Во первых, читать stdout и strerr запускаемых программ нужно в отдельном потоке. А вот с записью в stdin запускаемой программы получаются проблемы...
0
4 / 4 / 0
Регистрация: 26.10.2010
Сообщений: 8
27.10.2010, 17:31  [ТС] 4
Цитата Сообщение от 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(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:260)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.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 5
А просветите, пожалуйста, почему:
Java
1
String  commands [] = new String [] { "CMD.EXE","/C","echo hello"};
а не просто:
Java
1
String  commands [] = new String [] { "echo hello"};
?
0
635 / 527 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
02.11.2010, 14:18 6
Цитата Сообщение от MrCarp Посмотреть сообщение
Так я и так потоки out и err читаю в разных потоках.
И где ты это делаешь? В упор не вижу...

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

PS: получается бага в терминологии? потоки - это потоки ввода-вывода, и потоки - нити программы, процессы?
0
635 / 527 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
03.11.2010, 13:20 8
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 9
что-то мне пока знаний не хватает, чтобы в Вашем примере разобраться.
там, где группа процессов запускается - вроде понятно, а вот то, что происходит внутри этих самых нитей - не очень понял. можно алгоритм?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2010, 16:45
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru