2016-07-06 5 views
2

자바 프로그램을 작성 중입니다. 관리자로 앱을 실행해야하며 실행이 끝나면 다른 작업을 수행해야합니다. 처음에는 내가 JNA를 사용하여 특정 프로세스를 찾는 방법은 무엇입니까?

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

을 사용하지만, 문제는 내가 (내가 그것을 시도,하지만 난 해결책을 찾기 않았나) 암호를 입력 할 수 없습니다이었다. 후에, 나는 다음과 같이 그것을 만들 JNA를 사용 : 여기

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); 

, 문제는이 과정 종료 (어쩌면, JNA에,이 작업을 수행하는 형태가 될 때까지 프로그램의 실행을 기다릴 수 있도록하는 방법이다, 하지만이처럼 ... 너무 크고, 나는 그것을 할 방법을 알고하지는 ...) 내가 할 수있는 또 다른 방법을 생각

만 키우면 가능하면 내가 알고하지는 :

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)); 
    } 
} 

위도,이 ID와 프로세스 이름이 있습니다. 이 프로세스를 실행하는 사용자의 이름을 찾는 것이 가능합니까 ?? 내가 성공한다면, 나는 그것을 할 수있다. (관리자 만이이 프로세스가 실행될 수있다.)

감사합니다.

+0

프로세스의 입력 스트림을 사용해 보셨습니까? 네이티브 코드에 관한 부분은 시스템 의존적 인 코드를 사용한다면 시스템 의존적 인 방법을 사용해야 할 것이다. 그리고 코드를 작성한 OS를 지정한 경우 중복 목록이 길어질 수 있습니다. – Paul

+0

OS는 Windows 7입니다. 예, InputStream과 InputStreamReader를 사용하여 시도했지만 작동하지 않습니다. – RMNBA

+0

JNA 자체는 공유 라이브러리에서 코드를로드하고 실행하는 유틸리티 일뿐입니다. 작성하려는 코드는 작성한 OS에서 원시 코드로 실행해야합니다. 그래서 이것은 처음에는 자바 문제가 아니라 오히려 C++과 코드를 실행하고자하는 OS에 특정한 문제입니다. [이] (http://stackoverflow.com/questions/9454019/how-to-wait-for-a-process-to-finish-c) 트릭을해야합니다 – Paul

답변

0

해결했습니다. 이 true을 반환 할 때

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.

감사합니다.

관련 문제