2

我使用了一种方法“System.getenv();” 在 jar 应用程序中获取用户定义的环境变量的值。我已经让 jar 应用程序从窗口服务运行。但是当我尝试启动服务时,它没有获取用户定义的环境变量的值并显示空指针异常。我已经尝试在“System.getenv("JAVA_HOME");”中使用系统变量名 方法,通过获取相应的值可以正常工作。环境变量中的用户变量有什么错误。我应该在代码中做任何事情吗?

4

3 回答 3

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)。

于 2009-02-11T12:53:30.487 回答
2

Windows 服务代表系统而不是特定用户运行。我相信您可以将服务配置以特定用户身份运行,此时您可能会获得相关的环境变量 - 但使用属性文件或类似文件配置应用程序会好得多。

于 2009-02-11T11:34:37.620 回答
0

A windows service gets the user environment of the user the service runs as.

于 2009-02-11T19:28:46.327 回答