Значение пользовательской переменной в переменных среды не получается во время выполнения при запуске приложения jar из оконной службы?

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


person raja    schedule 11.02.2009    source источник
comment
Инкапсулировали ли вы свою Java-программу как службу с помощью проекта Java Service Wrapper от Tanukisoftware.org (dn.codegear.com / article / 32068)?   -  person VonC    schedule 11.02.2009
comment
Ага. Я использовал только Java Service Wrapper.   -  person raja    schedule 11.02.2009


Ответы (3)


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

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

http://www.adobe.com/devnet/contribute/articles/cps_autodeploy/fig06.gif

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

[ваша service] унаследует свою среду от процесса 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);

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

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

person VonC    schedule 11.02.2009

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

person Jon Skeet    schedule 11.02.2009

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

person Peter Lawrey    schedule 11.02.2009