2015-11-27 4 views
0

Я создал приложение Java и использовал метод Java Service Wrapper, который реализует WrapperListener, чтобы преобразовать его в службу Windows.Как определить вход пользователя с помощью Java Service Wrapper

WrapperManager может использоваться для идентификации различных событий, которые возникают при поднятии и улавливании в функции управления приемником-обертоком, что включает в себя выключение пользователя, однако не имеет входа пользователя в систему.

Есть ли способ, чтобы я мог зарегистрировать пользователя, входящего в систему, и выполнить какое-то действие в моем приложении Java? Если нет, есть ли способ обнаружить всплеск в использовании ЦП, который я могу использовать, чтобы сделать предположение о входе пользователя в систему? Это необходимо, потому что моему приложению необходимо выполнить некоторые действия, когда пользователь входит в систему.

ответ

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

обходной выше не является идеальным, но это возможный путь.

Немного больше информации об услуге, над которой вы работаете, действительно поможет.

EDIT:

На входе пользователя в систему, эта программа должна работать в качестве пользователя (см в нижней части для команды):

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); 
     } 
    } 
} 

Это является слушателем, который будет использоваться в вашем сервисе. Она работает как система:

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); 

Добавьте эти две строки в 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.файл политики:

java -Djava.security.manager -Djava.security.policy=java.policy -jar *my_login_notifier.jar*.jar 
+0

Я посмотрел, как это обычно достигается на C# - http://stackoverflow.com/a/ 5353269/3948757, и предположил, что это может быть достигнуто с помощью JSW. Служба, над которой я работаю, является «агентом», выполняющим задачи, заданные им «мастером» на другой машине. Агент должен определить, когда пользователь входит в систему, чтобы он мог сообщить мастеру и переключить задачи другому агенту. – Tom

+0

Вы правы, я близок к возможному решению. Существует расширенный служебный управляющий код SERVICE_CONTROL_SESSIONCHANGE. Java Service Wrapper не реализуется прямо из коробки, но есть способ. См. Это http://java-service-wrapper.996253.n3.nabble.com/Stopping-Service-before-Standby-td2726.html – gavxn

+0

Имеет ли значение, если информация о пользователе отсутствует? Поскольку Vista, Interactive Services Detection означало, что невероятно сложно получить информацию о текущем пользователе. Мне удалось найти компромисс в этой проблеме. Простое java-приложение, которое работает в userland и отправляет настраиваемый управляющий сигнал службе, которая работает снаружи. Приложение запускается при входе пользователя во время работы службы на уровне SYSTEM. API, getInteractiveUser() разбит так, что его нельзя использовать для получения пользовательской информации. Просто скажите, и я отредактирую свой ответ, чтобы включить код (он немного длинный). – gavxn

0

есть другое решение под названием JavaExe. С помощью этого инструмента вы можете получать некоторые системные события в своем приложении Java, например, User Connect или Disconnect, ...