2016-07-06 3 views
2

Je travaille sur un programme Java. Il doit exécuter une application en tant qu'administrateur et, une fois cette exécution terminée, faire d'autres choses. Au début, je l'ai utiliséComment trouver un certain processus en utilisant JNA?

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

mais le problème était que je ne peux pas entrer le mot de passe (je l'ai essayé, mais je n'allez pas trouver une solution). Après, je l'ai utilisé la JNA pour le faire, comme ceci:

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

Ici, le problème est de savoir comment faire attendre l'exécution du programme jusqu'à ce processus prend fin (peut-être, dans la JNA, il y a des formes pour ce faire, mais il est trop grand et je ne pas savoir comment faire ...)

Je pensais une autre façon de le faire, mais je ne sais pas se ... Comme aille on ceci:

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 cela, j'ai l'identifiant et le nom du processus. Il serait possible de trouver le nom de l'utilisateur qui exécute ce processus? Si je réussis, je pourrais être le faire (le seul processus exécuté en tant qu'administrateur serait celui-ci)

Cordialement.

+0

avez-vous essayé d'utiliser l'inputtream du processus? En ce qui concerne la partie sur le code natif: si vous utilisez du code dépendant du système, vous devrez également utiliser des méthodes dépendant du système. Et la liste des doublons serait longue, si vous spécifiez le système d'exploitation pour lequel vous écrivez le code. – Paul

+0

Le système d'exploitation est Windows 7. Oui, j'ai essayé InputStream et InputStreamReader et cela ne fonctionne pas ... – RMNBA

+0

Eh bien, vous devez d'abord comprendre que JNA n'est qu'un utilitaire pour charger et exécuter du code à partir de bibliothèques partagées. Le code que vous voulez créer doit s'exécuter comme du code natif sur l'OS pour lequel vous l'écrivez. Donc, ce n'est pas un problème java en premier lieu, mais plutôt un problème spécifique à C++ et à l'OS sur lequel vous voulez exécuter le code. [This] (http://stackoverflow.com/questions/9454019/how-to-wait-for-a-process-to-finish-c) devrait faire l'affaire – Paul

Répondre

0

Je l'ai résolu.

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, dans un autre côté, invoques plusieurs fois cette méthode quand il retourne true.

Cordialement.