【问题标题】:User Variable's value in environment variables is not getting during runtime while running jar application from window service?从窗口服务运行 jar 应用程序时,环境变量中的用户变量值在运行时未获取?
【发布时间】:2010-10-06 21:18:56
【问题描述】:

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

【问题讨论】:

  • 您是否使用 Tanukisoftware.org (dn.codegear.com/article/32068) 的 Java Service Wrapper 项目将您的 java 程序封装为服务?
  • 是的。我只使用了 Java Service Wrapper..

标签: java runtime.exec


【解决方案1】:

我确认 Windows 服务默认以“本地系统帐户”运行,不访问用户环境。

您可以使用服务的用户帐户登录。

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

但请注意,在您的计算机重新启动之前,您的服务将不知道环境变量 更改! (请参阅此Microsoft technote 或此SO question):

[your service] 将从 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 环境变量的所有部分)

然后您就可以query the window registry,直接读取存储在其中的“用户变量”(它们保存在HKEY_CURRENT_USER\Environment)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      Windows 服务获取运行该服务的用户的用户环境。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        • 1970-01-01
        • 2017-06-06
        • 2016-01-07
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        相关资源
        最近更新 更多