Registry cleaners have always been popular, but I never paid much attention to them. I originally thought that there might be valid reasons for their existence, but over time I changed my mind. But recently I've come to recognize that even today they can help maintain registry hygiene.
It used to be common for developers to write their own application installation routines to avoid paying hundreds of dollars for commercial setup toolkits. Their focus in coding installers was the installation part of setup because coding uninstallers is in some sense an admission that the software you've developed might not be useful or robust enough to become a permanent fixture on end-user systems. As a result, software uninstalls were often incomplete, leaving behind registry and file system detritus. A few hundred kilobytes of unused keys and values causes no noticeable performance impact on system operation, but I figured it was natural for a registry cleaner to be an essential part of running a tight ship for the anal-retentive systems administrator.
Installer technology has come a long way and today there are dozens of reliable
freeware and low-cost installation toolkits available both for old-style and
Windows Installer Package (.msi)-based setup. I previously believed that meant
the end of registry scrap and any reason for the existence of registry cleaners.
However, one of the Regmon troubleshooting examples Dave Solomon and I present
in our Windows Internals seminars made me realize that it's common for even
best-of-breed uninstallers that have earned the Windows logo from Microsoft
to leave our registries littered with traces of applications deleted long ago.
The troubleshooting example that triggered my realization is one in which a user discovered that Microsoft Internet Explorer (IE) would hang on startup unless he'd used his ISP's dialer to establish an Internet connection before opening IE. The user captured a Regmon trace of the hang and found references to his previous ISP's dialer in the RAS Phonebook key under the HKEY_ CURRENT_USER area of the registry. After deleting the stale values, the new ISP's dialer began launching like it was supposed to when IE opened.
Some research on my part suggests that the user had manually configured a RAS
phonebook entry, and when he changed ISPs had forgotten to update the entry.
But the fact that the problematic key in the example was in the per-user part
of the registry got me thinking. If the user's old dialer had created the phonebook
entry automatically, then been uninstalled from a different account, the user
would've been left with a broken IE configuration. That's because uninstallers
typically delete their application's systemwide settings from the HKEY_LOCAL_MACHINE
part of the registry and any per-user settings of the user running the uninstaller
from HKEY_CURRENT_USER. But what happens to the per-user settings of the other
users that used the application? You guessed it: Registry junk gets created,
and perhaps also file system junk in the application's Application Data folder
in the \Documents and Settings directories of other users. An uninstall is
thorough only if the user performing it is the only one that used the software.
Uninstallers that want to be as meticulous as possible could use the LoadUserProfile
Windows API to load each profile stored on the system, as listed in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\Current-Version\ProfileList, and look for their application settings in other
profiles. The problem with that approach is that registry permissions would
likely prevent a user from deleting keys in other users' profiles. Even if permissions
aren't an issue, domain users with roaming profiles carry application settings
with them to other computers, so profiles that need to be updated might not
be locally accessible.
So it appears that registry junk is a Windows fact of life and that registry
cleaners will continue to have a place in the meticulous system administrator's
tool chest, at least until we're all running Microsoft .NET applications that
store their per-user settings in XML files . . . and then, of course, we'll need
XML cleaners.
—Mark Russinovich
End of Article