我使用了一种方法“System.getenv();” 在 jar 应用程序中获取用户定义的环境变量的值。我已经让 jar 应用程序从窗口服务运行。但是当我尝试启动服务时,它没有获取用户定义的环境变量的值并显示空指针异常。我已经尝试在“System.getenv("JAVA_HOME");”中使用系统变量名 方法,通过获取相应的值可以正常工作。环境变量中的用户变量有什么错误。我应该在代码中做任何事情吗?
3 回答
我确认 Windows 服务默认以“本地系统帐户”运行,它不访问用户环境。
您可以使用服务的用户帐户登录。
替代文字 http://www.adobe.com/devnet/contribute/articles/cps_autodeploy/fig06.gif
但请注意,在您的计算机重新启动之前,您的服务不会知道环境变量的 变化!(请参阅此Microsoft 技术说明或此SO 问题):
[
您的服务]
将从Services.exe进程继承其环境。
当 Windows 启动时,Services.exe 进程接收本地系统帐户的环境设置。
由于 Services.exe 进程不使用 Windows 消息传递,因此当它接收到指示在 Windows 启动后值已更改的消息时,Services.exe 进程不会更新其环境设置。
您不能强制正在运行的服务确认本地系统帐户环境的动态更改。
这可能不是问题JAVA_HOME
(它不会经常改变),但可能是其他动态设置的环境变量。
如果这成为一个问题(例如,如果您无法使用给定的用户帐户启动服务),您可以在您的 java 程序中嵌入一个run as命令,以便查询注册表并获取您的环境的当前值多变的
String commands [] = new String [] {
"CMD.EXE",
"/C",
"RUNAS /savecred /user:"
+ username
+ " " + "regedit.exe"
};
Runtime.getRuntime().exec(commands);
with username = 当前连接的用户的登录名(如果没有人连接,则需要跳过基于 USER 环境变量的程序的所有部分)
然后,您将能够查询窗口注册表,直接读取存储在其中的“用户变量”(它们保存在 中HKEY_CURRENT_USER\Environment
)。
Windows 服务代表系统而不是特定用户运行。我相信您可以将服务配置为以特定用户身份运行,此时您可能会获得相关的环境变量 - 但使用属性文件或类似文件配置应用程序会好得多。
A windows service gets the user environment of the user the service runs as.