2012-03-20 4 views
0

Я пытаюсь запустить службу окна в Java с помощью этогоЗапуск службы Windows с Java

public static void main(String[] args) throws IOException { 
     String startCom = "net start"; 
     String startProc = "\"C:/Program Files/Common Files/Apple/Mobile Device Support/bin/AppleMobileDeviceService.exe\""; 
     Runtime rt = Runtime.getRuntime(); 
     Process proc = rt.exec(startCom + startProc);  
     System.out.println("Starting It"); 

} 

Он работает без исключений, но не запускается сервис. Что я делаю не так?

+2

Вы пытались использовать proc.getOutputStream и proc.getErrorStream? – miniBill

+0

@skaffman: позволяет ли Java Service Wrapper запускать существующие службы Windows? Кажется, я не могу найти это среди его списка [features] (http://wrapper.tanukisoftware.com/doc/english/product-features.html). – Bernard

+0

Прочтите http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html –

ответ

0
  1. Постарайтесь выяснить, что такое зарегистрированное имя службы, и использовать это вместо полного исполняемого файла. Например:

    net start "Adobe Acrobat Update Service"

    Вы можете узнать имя службы по запустив net start на окне командной строки (которая выводит список всех зарегистрированных услуг) или путем нахождения сервиса в панели управления Services, нажав Старт кнопка, набрав services.msc, и нажимая Введите. Если имя службы является загадочным, вы можете щелкнуть правой кнопкой мыши службу на панели управления Службы и нажать Свойства, чтобы подтвердить исполняемый файл этой службы.

  2. Возможно, вам необходимо выполнить команду с повышенными привилегиями. Вы можете сделать это, отключив UAC (не рекомендуется), запустив javaw.exe с повышенными привилегиями при запуске вашей программы или с помощью утилиты вроде Elevate.exe для выполнения любых привилегированных команд.

  3. Если у вас возникли проблемы с получением Runtime.exec для выполнения ваших ставок, попробуйте вместо этого использовать ProcessBuilder.

  4. И, наконец, рекомендуется всегда читать содержимое STDOUT и STDERR (от Process.getOutputStream() и Process.getErrorStream()). Они могут содержать диагностическую информацию; но, что еще более важно, если буферы заполняются, а Process все еще выводит на них, то Process будет висеть.

+0

Привет всем: Спасибо за помощь, все еще не работаю, я попробовал начать сеть, просто имя из командной строки говорит, что его недопустимое имя ищет исполняемый файл (который тоже не работает). Думаю, это оставляет меня с processbuilder?getErrorStream возвращает [email protected], все еще пытаясь найти это ... – RobD

+0

Вы получаете ту же ошибку, что и при запуске 'net start SERVICENAME', в командной строке? Что касается последней ошибки, о которой вы упомянули, вы не сможете использовать ее как строку напрямую - вы хотите прочитать содержимое потока ошибок так же, как при чтении из FileInputStream или другого InputStream: http: // docs.oracle.com/javase/tutorial/essential/io/charstreams.html – rob

+0

Привет, Роб, Да, его высказывание Недействительное имя, поэтому я возвращаюсь к использованию этого процесса proc = rt.exec ("net start \" C:/Program Files/Общие файлы/Поддержка Apple/Mobile Device/bin/AppleMobileDeviceService.exe \ ""); Происходит системная ошибка 123. Неверное имя файла, имя каталога или тома. Это должно быть связано с тем, как Im ускользает от пути к службе, но до сих пор ничего не сработало ... – RobD

0

Попробуйте этот код:

public static void main(String[] args) throws IOException { 

    Runtime rt = Runtime.getRuntime(); 
    Process proc = rt.exec("cmd start /c C:/Program Files/Common Files/Apple/Mobile Device Support/bin/AppleMobileDeviceService.exe");  
    System.out.println("Starting It"); 
0

Это выглядит как ваши основные() выходы, так что ваша служба будет умереть. В этом случае вам необходимо установить службу с помощью

sc create "servicename" binpath="path", 

, а затем запустить его с

sc start "servicename. 

То есть, сервис .exe еще должен быть установлен в качестве службы Windows.

Смежные вопросы