2016-07-06 10 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)パスワードを入力することはできませんでした。後、私はこのような、それを作るために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で、これを行うためのフォームがあるまで、プログラムの実行を待つために作る方法です、しかし、このように...大きすぎると私はそれを行う方法を知っているドント...)私はそれを行うための別の方法を考え

が、it's可能であれば私が知っているドント:

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上でネイティブコードとして実行する必要があります。だから、これは最初はJavaの問題ではなく、むしろコードを実行する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。

よろしくお願いいたします。

関連する問題