我目前正在尝试解决 Java Web 应用程序的一个问题,这个问题让我和软件供应商都感到困惑。我们在装有 Tomcat 8 的 Windows Server 2012 上运行。在我的场景中,应用程序使用安装程序来设置文件和环境。作为设置过程的一部分,将提供 Tomcat 将在其下运行的服务帐户。在此示例中,我将调用服务帐户srvTomcat
。
失败
上下文:Tomcat 作为 Windows 服务运行
用户:srvTomcat
在此上下文中运行 Tomcat 后,我们可以登录并与 UI 交互。但是,当应用程序尝试在磁盘上创建新目录时失败。(E:\xxx\xxx)在故障排除期间,我们已授予服务帐户对目录和文件共享的完全控制权,但问题仍然存在。日志仅告诉我们无法创建目录。
成功
上下文:从管理员命令提示符运行的 Tomcat
用户:srvTomcat
当在与上述故障相同的帐户下运行管理员命令提示符启动 Tomcat 时,一切正常。该应用程序可以在磁盘上创建目录。
据我所知,作为 Windows 服务运行(失败)和从管理员命令提示符运行(有效)时使用的配置选项没有区别。Windows Server 2012 是否有任何新的安全选项可能导致此问题?
答案1
我的一位同事确实找到了我们遇到的问题的解决方案。简而言之,这归结为在 vSphere 5 上运行 Windows Server 2012。在我们的案例中,应用程序尝试写入的驱动器 (D:) 被视为热插拔设备,这似乎是在 vSphere 5.0 上运行 Windows Server 2012 时的默认设置,而我们的构建过程并未考虑到这一点。通过控制台运行时,Tomcat/Java 安全设置允许写入此类驱动器。但是,当作为服务运行时,访问被拒绝并且写入失败。
要修复此问题,我们必须确保 Windows 不会将驱动器视为热插拔,这可以通过以下步骤完成:
- 使用 vSphere Client 连接到 ESXi/ESX 主机或 vCenter Server。
- 关闭虚拟机。
- 右键单击虚拟机,然后单击编辑设置。
- 单击“选项”选项卡。
- 单击常规 > 配置参数 > 添加行。
- 插入一个名为 devices.hotplug 且值为 false 的新行。
- 启动虚拟机。
上述步骤可在以下网址找到:http://www.jonathanmedd.net/2013/06/windows-server-2012-on-vsphere-5-0-the-case-of-the-missing-d-drive.html。