一位客户提供了一个 Windows Server 2012R2 实例作为我们的服务器。今天早上(7 月 25 日),我重新连接到该机器以更改密码,并立即收到提示,提示 Java 安装成功,并要求卸载旧版本的 Java。
这令人担忧,因为我们的服务器应用程序是基于 Java 的,并且当前运行在旧版本的 Java 上(这对于我们的目的来说没有问题),如果您删除了正在使用的版本,则卸载旧版本的 Java 可能会导致我们的服务器应用程序失败!
当然,我拒绝删除旧版本的 Java,但我和同事对系统提示我感到不安。如果其他人在不知道我们依赖 Java 的情况下登录,他们可能会删除旧版本。
我检查了我的 Java 更新设置,发现它已设置为检查,但在下载前会提示。(因为我甚至禁用了检查。)
我们进一步调查,并在事件查看器中发现,7 月 20 日中午左右,新版本的 Java(8 更新 101)安装在了机器上,显然是我安装的(或者是用我的用户 ID 安装的)。但是,我们知道不是我安装的,因为那天我在黄石国家公园度假,没有网络!我的用户 ID 是一个具有管理员权限的 AD 帐户,但名为“smmccants”,没有共享密码。我确实在服务器上运行了一个会话(我通常会断开连接而不是注销)。
今天早上(2016 年 7 月 25 日上午 10:00 之前)我重新连接并与 Java 对话框交互,但在事件查看器中找不到任何有趣的东西。
我们希望了解发生了什么,并防止将来再次发生。您知道这种情况是如何自动发生的吗?我们还应该在哪里寻找线索?
以下是我在 EventViewer 中找到的日志。
来自事件查看器(来源:MsiInstaller),时间为 2016 年 7 月 20 日上午 11:59:44:
开始 Windows 安装程序事务:C:\Users\smmccants\AppData\LocalLow\Oracle\Java\jre1.8.0_101\jre1.8.0_101full.msi 客户端进程 ID:87064
来自 MsiInstaller,发布于 2016 年 7 月 20 日 12:00:29:
产品:Java 8 Update 101--安装已成功完成
-
Windows Installer 已安装产品。产品名称:Java 8 Update 101。产品版本:8.0.1010.13。产品语言:1033 制造商:Oracle Corporation。安装成功或错误状态:0。
-
结束 Windows 安装程序事务:C:\Users\smmccants\AppData\LocalLow\Oracle\Java\jre1.8.0_101\jre1.8.0_101full.msi。客户端进程 ID:87064
-
开始 Windows 安装程序事务:{4A03706f-666A-4037-7777-5F2748764D10}。客户端进程 ID:87064
然后从 RestartManager(不管它是什么......):
开始会话 0 - 2016-07-20T17:00:29.904899600Z
最后,我们得到了一个新的时间戳 7/20/16 12:00:39 并且 MsiInstaller 报告:
产品:Java Auto Updater —— 删除已成功完成。
谁下令删除?他们是如何通过我的用户帐户删除的?可能是 Java 8 Update 101 安装过程的一部分。
Windows Installer 已删除该产品。产品名称:Java Auto Updater。产品版本:2.8.77.3 产品语言:1033 制造商:Oracle Corporation。删除成功或错误状态:0。
-
结束 Windows 安装程序事务:{4A03706f-666A-4037-7777-5F2748764D10}。客户端进程 ID:87064
-
开始 Windows 安装程序事务:C:\Users\smmccants\AppData\LocalLow\Oracle\Java\jre1.8.0_101\au.msi。客户端进程 ID:87064
现在下午 12:00:40
产品:Java Auto Updater--安装已成功完成。
-
Windows Installer 安装了该产品。产品名称:Java Auto Updater。产品版本 2.8.101.13。产品语言:1033。制造商:Oracle Corporation。安装成功或错误状态:0。
-
结束 Windows 安装程序事务:C:\Users\smccants\AppData\LocalLow\Oracle\Java\jre1.8.0_101\au.msi。客户端进程 ID:87064。
-
开始 Windows 安装程序事务:{26A24AE4-039D-4Ca4-87B4-2F83218077F0}。客户端进程 ID:87064
现在我们回溯一秒到下午 12:00:39,查看来自 RestartManager 的一条消息:
结束会话 0 开始于 2016-07-20T17:00:29.904899600Z
现在 RestartManager 于下午 12:00:40 运行:
开始会话 0 - 2016-07-20T17:00:40.326806900Z
-
结束会话 0 开始于 2016-07-20T17:00:29.904899600Z
现在我们在下午 12:01:07 看到了真正可怕的 MsiInstaller 消息:
产品:Java 8 Update 77--删除已成功完成。
-
Windows Installer 已删除该产品。产品名称:Java 8 Update 77。产品版本:8.0.770.3。产品语言:1033。制造商:Oracle Corporation。删除成功或错误状态:0。
下一条消息以 SYSTEM 用户身份记录,而不是我。
结束 Windows 安装程序事务:{26A24AE4-039D-4Ca4-87B4-2F83218077F0}。客户端进程 ID:87064
这就是我所发现的全部。
答案1
我们还没有看到这个问题再次发生。我们做了两件事来帮助缓解这种行为:
- 将 Java AutoUpdate 设置为从不检查更新。
- 编写我们的服务启动代码,使其更智能地了解 Java 的位置。我们可以硬编码 Java 版本的路径,但如果不存在,它将查询注册表以查找已安装的其他版本。这样,删除旧版本就不会破坏我们的服务器。