Запуск / остановка служб с использованием JNA - PullRequest
8 голосов
/ 29 июля 2011

Я пишу утилиту для запуска и остановки служб Windows. Программа будет распространяться на многие компьютеры с разными уровнями пользовательских привилегий, поэтому я не хочу использовать командную строку. Я пытался использовать JNA,

import com.sun.jna.platform.win32.W32Service;
import com.sun.jna.platform.win32.W32ServiceManager;
import com.sun.jna.platform.win32.Winsvc;

/**
 *
 * @author 
 */
public class WindowsServices {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
      try
      {

        // TODO code application logic here
         W32ServiceManager serviceManager = new W32ServiceManager();

        W32Service service = serviceManager.openService("uvnc_service", Winsvc.SERVICE_ACCEPT_STOP);
        service.stopService();
        service.close();   
      }
      catch (Exception ex)
      {
          ex.printStackTrace();
      }


    }
}

Когда я запускаю программу, я получаю следующую ошибку

com.sun.jna.platform.win32.Win32Exception: дескриптор недействителен. на com.sun.jna.platform.win32.W32ServiceManager.openService (W32ServiceManager.java:77) в windowsservices.WindowsServices.main (WindowsServices.java:26)

Любые предложения будут наиболее полезны.

Ответы [ 2 ]

1 голос
/ 17 ноября 2016

Спасибо за предложение, автор вопроса обнаружил ошибку.

import com.sun.jna.platform.win32.W32Service;
import com.sun.jna.platform.win32.W32ServiceManager;
import com.sun.jna.platform.win32.Winsvc;

/**
 *
 * @author 
 */
public class WindowsServices {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try
        {
            W32ServiceManager serviceManager = new W32ServiceManager();
            serviceManager.open(Winsvc.SC_MANAGER_ALL_ACCESS); 
            W32Service service = serviceManager.openService("uvnc_service", Winsvc.SC_MANAGER_ALL_ACCESS);
            service.startService();
            service.close();
        } catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

Ошибка состояла в том, что код не открыл диспетчер управления службами.Я искал на MSDN и нашел процесс, которому я должен был следовать.Я также случайно выбрал значение разрешения, которое могло также вызвать сбой.

0 голосов
/ 29 июля 2011

Мы используем Runtime.getRuntime.exec() и затем выполняем команду

cmd / c net start

для запуска служб и

cmd/ c net stop

для остановки служб.

Конечно, вы должны знать названия сервисов (а в нашем случае это DB2, за нами).Но это сработало для нас.

...