Я подтверждаю, что служба 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
).