0

Java アプリケーションを作成し、 WrapperListenerを実装するJava Service Wrapperメソッド 3 を使用してそれを Windows サービスに変換しました。

WrapperManagerを使用して、ラッパー リスナーの controlEvent 関数で発生およびキャッチされるさまざまなイベントを識別できます。これには、ユーザーのログオフが含まれますが、ユーザーのログイン イベントは含まれません。

システムにログインしているユーザーを検出し、Java アプリケーションで何らかのアクションを実行する方法はありますか? そうでない場合、ユーザーがログインしていると推測するために使用できる CPU 使用率のスパイクを検出する方法はありますか? ユーザーがログインしたときにアプリケーションが何らかのアクションを実行する必要があるため、これが必要です。

4

2 に答える 2

2

サービス コントロール マネージャー内には、ユーザー ログオン用のログオン制御コードはありません。さらに、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
于 2015-11-28T04:10:30.977 に答える