The problem happens because when the Java plugin is loaded by IE on
Windows XP under a non-admin user account, the required static versioning
registry entries are missed from both the HKCU and HKLM branches.
Earlier these entries were updated in the HKCU branch every time
IE loaded the Java plugin. Recently the performance fix JDK-7029567 +
JDK-7067322 reduced the set of updated entries to those corresponding
to the current Java version only.
The CLSID registry entries are updated in two cases:
- The Java installer is registering the Java plugin in the system.
It is always run under an administrator user account, and in case
of Windows Vista or later OS, in the high integrity mode. It always
registers the full set of CLSID registry entries.
- IE loads the Java plugin library. This is how the registry entries
appear in the HKCU branch for a non-admin user account. After
the performance fix, only a limited set of registry entries is
updated, and this exposes the issue.
The code responsible for updating the CLSID registry entries is located
The original design (before Windows Vista) was that for non-multi-user
Windows platform (for example, Windows 98), the code puts entries into
the HKLM branch. Otherwise, it puts them into the HKCU branch.
Windows Vista introduced a security restriction described here:
"If the integrity level of a process is higher than Medium,
the COM runtime ignores per-user COM configuration and accesses
only per-machine COM configuration." So the code had to be changed
to its current state, and, besides the HKCU branch, the HKLM branch
is also updated for Windows Vista and later OSes if the process is
running in the high integrity mode.
This is why the problem is not seen with Windows Vista and later OSes -
the required entries are taken from the HKLM branch.
The fix is to put the entries into the HKLM branch (besides the HKCU
branch) for Windows versions earlier than Windows Vista, too.
Conceptually, Java is installed and Java plugins are registered
per-machine, not per-user. So, a logical solution would be to always
add the static versioning entries to the HKLM branch only. I didn't follow
this way because it may create some compatibility issues. The HKCU
entries, if present, take precedence over the HKLM entries. It may
create some undesired effects when several Java versions are installed
on the same machine.