サービス コントロール マネージャー内には、ユーザー ログオン用のログオン制御コードはありません。さらに、Java Service Wrapper は共通の制御信号を利用します。イベント処理を行うときに CTRL_LOGON_EVENT を使用してもあまり意味がありません: https://msdn.microsoft.com/en-us/library/windows/desktop/ms683242.aspx
Windows イベント ログで [セキュリティ] の下のイベント ID 4648 を探し、イベント サブスクリプションの実装をプログラミングすることを検討する必要があるかもしれませんが、Windows API と Java Native Access ライブラリの使用法を理解している必要があります。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa385771.aspx
上記の回避策は理想的ではありませんが、可能な方法です。
あなたが取り組んでいるサービスについてもう少し情報があれば、本当に役に立ちます。
編集:
ユーザー ログイン時に、このプログラムはユーザーとして実行する必要があります (コマンドについては下部を参照してください)。
LoginServiceDefer.java
import org.tanukisoftware.wrapper.WrapperManager;
public class LoginServiceDefer {
public static String svc = "loginservice";
public static int ctrl = 155;
public static void main(String[] args) {
System.out.println("Sending user control code.");
try {
WrapperManager.sendServiceControlCode(svc, ctrl);
WrapperManager.stop(0);
} catch (Exception re) {
System.err.println("System error. Unable to send control code to service, " + svc + ", with control code, " + ctrl + ".");
re.printStackTrace();
WrapperManager.stop(1);
}
}
}
これは、サービスで使用されるリスナーです。SYSTEM として実行されます。
LoginListener.java
import org.tanukisoftware.wrapper.event.WrapperEvent;
import org.tanukisoftware.wrapper.event.WrapperEventListener;
import org.tanukisoftware.wrapper.event.WrapperServiceControlEvent;
public class LoginListener implements WrapperEventListener
{
public LoginListener() { }
public void fired( WrapperEvent event ) {
if (event instanceof WrapperServiceControlEvent) {
WrapperServiceControlEvent scEvent = (WrapperServiceControlEvent) event;
switch (scEvent.getServiceControlCode()) {
case 155:
// LoginServiceDefer has sent a control code.
break;
}
}
}
}
この行を WrapperManager.start() の前に追加します
WrapperManager.addWrapperEventListener(new LoginListener(), WrapperEventListener.EVENT_FLAG_SERVICE);
次の 2 行を wrapper.conf に追加します。
wrapper.java.additional.1=-Djava.security.manager
wrapper.java.additional.2=-Djava.security.policy=java.policy
java.policy という名前の新しいファイルを作成します。
それを Wrapper.exe のあるフォルダー (wrapper-windows/bin/wrapper.exe のはず) に置きます。
// NOTE: There are ways of limiting the permissions for the notifier using the the library.
grant codeBase "file:../lib/wrapper.jar" {
permission java.security.AllPermission;
};
// Change *my_login_notifier.jar* to whatever LoginServiceDefer.java is as a jar.
grant codeBase "file:./*my_login_notifier.jar*" {
permission java.security.AllPermission;
};
ユーザーのログイン時に次のコマンドを実行し、cd でパスに移動するか、java.policy ファイルを編集してください。
java -Djava.security.manager -Djava.security.policy=java.policy -jar *my_login_notifier.jar*.jar