Нет кода входа для входа пользователя в систему диспетчера управления службами. Кроме того, 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
Я посмотрел, как это обычно достигается на C# - http://stackoverflow.com/a/ 5353269/3948757, и предположил, что это может быть достигнуто с помощью JSW. Служба, над которой я работаю, является «агентом», выполняющим задачи, заданные им «мастером» на другой машине. Агент должен определить, когда пользователь входит в систему, чтобы он мог сообщить мастеру и переключить задачи другому агенту. – Tom
Вы правы, я близок к возможному решению. Существует расширенный служебный управляющий код SERVICE_CONTROL_SESSIONCHANGE. Java Service Wrapper не реализуется прямо из коробки, но есть способ. См. Это http://java-service-wrapper.996253.n3.nabble.com/Stopping-Service-before-Standby-td2726.html – gavxn
Имеет ли значение, если информация о пользователе отсутствует? Поскольку Vista, Interactive Services Detection означало, что невероятно сложно получить информацию о текущем пользователе. Мне удалось найти компромисс в этой проблеме. Простое java-приложение, которое работает в userland и отправляет настраиваемый управляющий сигнал службе, которая работает снаружи. Приложение запускается при входе пользователя во время работы службы на уровне SYSTEM. API, getInteractiveUser() разбит так, что его нельзя использовать для получения пользовательской информации. Просто скажите, и я отредактирую свой ответ, чтобы включить код (он немного длинный). – gavxn