Значение переменной пользователя в переменных среды не получается во время выполнения при запуске jar-приложения из оконной службы? - PullRequest
2 голосов
/ 11 февраля 2009

Я использовал метод "System.getenv ();" чтобы получить значение определенной пользователем переменной среды в jar-приложении. Я сделал приложение jar для запуска из оконного сервиса. Но когда я пытаюсь запустить службу, она не получает значение, определенное пользователем, и показывает исключение нулевого указателя. Я пытался с именем системной переменной в "System.getenv (" JAVA_HOME ");" метод, он работает нормально, получив соответствующее значение. В чем ошибка с пользовательской переменной в переменных окружения. Должен ли я сделать что-нибудь в коде?

Ответы [ 3 ]

3 голосов
/ 11 февраля 2009

Я подтверждаю, что служба Windows по умолчанию работает как «Локальная системная учетная запись», которая не имеет доступа к пользовательской среде.

Вы можете использовать учетную запись пользователя для службы для входа в систему.

альтернативный текст http://www.adobe.com/devnet/contribute/articles/cps_autodeploy/fig06.gif

Но имейте в виду, что ваш сервис не будет знать о переменной среды , изменит до перезагрузки компьютера! (См. Техническое замечание Microsoft или ТАК * вопрос ):

[ ваша служба ] унаследует свою среду от процесса Services.exe .
Процесс Services.exe получает параметры среды для учетной записи локальной системы при запуске Windows.
Поскольку процесс Services.exe не использует Windows Messaging, при получении сообщений, указывающих, что значение изменилось после запуска Windows, процесс Services.exe не обновляет свои параметры среды.
Вы не можете заставить службу, которая работает, подтверждать динамическое изменение среды учетной записи локальной системы.

Это может не быть проблемой для JAVA_HOME (которая меняется не часто), но может быть для другой динамически устанавливаемой переменной среды.


Если это становится проблемой (как, например, если вы не можете запустить службу с определенной учетной записью пользователя), вы можете встроить в свою Java-программу , запущенную как команда для запроса реестра и получения текущего значения вашей переменной среды

  String  commands [] = new String [] {
    "CMD.EXE",
    "/C",
    "RUNAS   /savecred /user:" 
    + username 
    + " " + "regedit.exe"
  };

  Runtime.getRuntime().exec(commands);

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

После этого вы сможете запрашивать реестр окон , читая непосредственно «пользовательские переменные», хранящиеся в нем (они хранятся в HKEY_CURRENT_USER\Environment).

2 голосов
/ 11 февраля 2009

Службы Windows запускаются от имени системы, а не от конкретного пользователя. Я полагаю, что вы можете настроить службу для запуска как определенного пользователя, после чего может получить соответствующую переменную среды - но было бы намного лучше настроить приложение с файл свойств или что-то подобное.

0 голосов
/ 11 февраля 2009

Служба Windows получает пользовательскую среду пользователя, от имени которой работает служба.

...