2011-07-29 17 views
8

Windowsサービスを開始および停止するユーティリティを作成しています。このプログラムは、さまざまなレベルのユーザー権限を持つ多数のコンピュータに分散されるので、コマンドラインを使用したくないです。ハンドルが無効です:私は、私は次のようなエラーにJNAを使用したサービスの開始/停止

com.sun.jna.platform.win32.Win32Exceptionを取得するプログラムを実行すると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.W32ServiceManager.openServiceで windowsservices.WindowsServices.mainで(W32ServiceManager.java:77) (WindowsServices.java:26)

任意の提案は、最も参考になります。

+0

これはかなり涼しく、あなたがJNAでWindowsサービスを簡単に制御できるかどうかわかりませんでした。 – tmbrggmn

+0

この方法で見つかった唯一の問題は、サービスを停止しようとすると、一部のサービスが実行中から停止するまでに時間がかかるため、余分なtry/catchブロックを提供する必要があるということです。 – GEverding

+0

あなたはsuholdが有効な答えとして答えを追加します – gavioto

答えて

0

我々は

サービスを開始すると

CMD/Cネット停止Runtime.getRuntime.exec()使用して、コマンドに

CMD/Cネットスタートを実行

サービスを停止する。

もちろん、サービス名を知っている必要があります(ここではDB2です)。しかし、これは私たちのために働いています。

1

提案のおかげで、質問の作成者はエラーを発見しました。

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

これは良い解決策です – gavioto

関連する問題