2016-07-06 4 views
2

Я работаю над программой на Java. Он должен запускать приложение в качестве администратора, и, когда это завершение завершается, выполните другие действия. В начале, я использовалКак найти определенный процесс с использованием JNA?

String cmd[] = new String [3]; 
cmd [0] = "cmd"; 
cmd [1] = "/C"; 
cmd [2] = "runas /user:..." 
Process p = Runtime.getRuntime().exec(cmd); 

но проблема была я не могу ввести пароль (я пробовал, но я didn't найти решение). После, я использовал ЮНА, чтобы сделать это, как это:

boolean CreateProcessWithLogonW 
    (WString lpUsername, 
    WString lpDomain, 
    WString lpPassword, 
    int dwLogonFlags, 
    WString lpApplicationName, 
    WString lpCommandLine, 
    int dwCreationFlags, 
    Pointer lpEnvironment, 
    WString lpCurrentDirectory, 
    STARTUPINFO lpStartupInfo, 
    PROCESS_INFORMATION lpProcessInfo); 

Здесь проблема заключается в том, как сделать, чтобы ждать выполнения программы до этого процесса конца (возможно, в ЮНА, есть формы, чтобы сделать это, но слишком большой, и я не знаю, как это сделать ...)

Я думал, еще один способ сделать это, но я не знаю, если это возможно ... подмигнули как это:

Kernel32 kernel32 = (Kernel32) Native.loadLibrary(Kernel32.class, W32APIOptions.UNICODE_OPTIONS); 

Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();   

WinNT.HANDLE snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0)); 
try 
{ 
    while (kernel32.Process32Next(snapshot, processEntry)) 
    {    
     System.out.println(processEntry.th32ProcessID + "\t" + Native.toString(processEntry.szExeFile)); 
    } 
} 

Whit this, у меня есть идентификатор и имя процесса. Можно было бы найти имя пользователя, который запускает этот процесс? Если мне удастся, я мог бы это сделать (единственный процесс, выполняемый администратором, был бы таким)

С уважением.

+0

Вы пытались использовать входной процесс процесса? Что касается части о собственном коде: если вы используете системный код, вам также придется использовать зависящие от системы методы. И список дубликатов будет длинным, если вы указали ОС, на которые вы пишете код. – Paul

+0

ОС - Windows 7. Да, я пробовал использовать InputStream и InputStreamReader, и он не работает ... – RMNBA

+0

Ну, сначала вы должны понять, что сама JNA - это всего лишь утилита для загрузки и запуска кода из разделяемых библиотек. Код, который вы хотите создать, должен запускаться как собственный код в ОС, для которого вы его записываете. В первую очередь это не проблема Java, а скорее проблема, характерная для C++ и ОС, на которой вы хотите запустить код. [This] (http://stackoverflow.com/questions/9454019/how-to-wait-for-a-process-to-finish-c) должен сделать трюк – Paul

ответ

0

Я решил.

public boolean jambo_loco (int pid) 
{ 

    Kernel32 kernel32 = (Kernel32) Native.loadLibrary(Kernel32.class, W32APIOptions.UNICODE_OPTIONS); 
    Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();   

    WinNT.HANDLE snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0)); 
    try 
    { 
     int i = 0; 

     int size = processEntry.dwSize.intValue(); 

     while (kernel32.Process32Next(snapshot, processEntry) && i < size) 
     {    
      if (processEntry.th32ProcessID.intValue() == pid) 
       return true; 
      i++; 
     } 

    } 
    finally 
    { 
     kernel32.CloseHandle(snapshot); 
    } 
    return false; 
} 

loop, в другой стороне, invoques много раз этого метода, когда он возвращается true.

С уважением.

Смежные вопросы