2016-07-06 24 views
2

Ich arbeite an einem Java-Programm. Es muss eine App als Administrator ausführen und, wenn diese Ausführung endet, andere Dinge tun. Am Anfang verwendet iWie finden Sie einen bestimmten Prozess mit JNA?

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

aber das Problem war ich nicht das Passwort eingeben kann (ich versuchte es, aber er Artikel nicht Lösung finden). Nach verwendet i JNA es zu machen, wie folgt aus:

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

Hier ist das Problem, wie die Ausführung des Programms bis dieser Vorgang beendet wurde, warten machen (vielleicht, in JNA, gibt es Formen, dies zu tun, aber ist zu groß, und ich weiß nicht, wie es zu tun ...)

ich einen anderen Weg dachte, es zu tun, aber ich weiß nicht, ob es ist möglich ... So:

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

Mit diesem habe ich die ID und den Namen des Prozesses. Es wäre möglich, den Namen des Benutzers zu finden, der diesen Prozess ausführt? Wenn es mir gelingt, könnte ich es tun (der einzige Prozess als Administrator ausführen würde dieses sein)

Grüße.

+0

haben Sie versucht, den Eingangsstrom des Prozesses zu verwenden? Was den Teil über nativen Code betrifft: Wenn Sie systemabhängigen Code verwenden, müssen Sie auch systemabhängige Methoden verwenden. Und die Liste der Duplikate wäre lang, wenn Sie das Betriebssystem angeben, für das Sie den Code schreiben. – Paul

+0

Das Betriebssystem ist Windows 7 Ja, Ive versucht, mit Input und Input und es nicht funktioniert ... – RMNBA

+0

Nun, müssen Sie zuerst verstehen, dass JNA selbst ist nur ein Dienstprogramm, und Ausführen von Code aus dem gemeinsamen genutzten Bibliotheken zu laden. Der Code, den Sie erstellen möchten, muss als systemeigener Code auf dem Betriebssystem ausgeführt werden, für das Sie ihn schreiben. Das ist also kein Java-Problem, sondern ein C++ - spezifisches Problem und das Betriebssystem, auf dem der Code ausgeführt werden soll. [This] (http://stackoverflow.com/questions/9454019/how-to-wait-for-a-process-to-finish-c) sollte den Trick tun – Paul

Antwort

0

Ich löste es.

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

A loop, in anderen Seite invoques viele Male diese Methode, wenn es true zurückgibt.

Grüße.