With the advent of this Windows 2000 tool, there’s finally a concerted effort to get .DLL hell and similar problems under control.

Inside Windows Installer

With the advent of this Windows 2000 tool, there’s finally a concerted effort to get .DLL hell and similar problems under control.

To those interested in cool stuff like OSs and designing systems that deliver frames from place to place, the release of Windows 2000 is a highly anticipated event. Well, actually it already has been released, in dribs and drabs throughout the last few years, but there’s still something about the official release day that legitimizes a product. It removes the last excuse of, “It’s still in beta,” when unfortunate events occur.

But sometimes we get so caught up in the cool new way that technology is implemented, we lose sight of the fact that we’re really only building a delivery mechanism. It’s akin to the design engineer or mechanic on a new slick engine focusing on the new fuel efficiencies. In fact, the person using the car wants only to get from one place to another, oblivious to the “magic” under the hood. In IT, this distinction between us and them will only grow with time and maturation of systems.

We mechanics and designers spend considerable time building and maintaining our electronic plumbing systems to present a stable platform for what the end user really cares about. That’s mainly applications (and, I might add, applications that work properly when users select a menu function). As we all know, we can have the most wonderful, elegant, stable, available, and supportable network, only to have irritating, obese code images indulgently read and write to our files systems and registries—not to mention our new directory service. Applications are the acknowledged reason computers even exist; but it would be useful to have a better method to manage them without having to abandon the desktop and run back to the completely centralized mainframe mentality that server-based companies love to tout.

Configuration Control

The underlying problem with application storage and management is that each developer has his or her own idea—and opportunity—about how to implement the installing and storing of configuration information in the registry and directory structure. Developers also rely on shared globs of code without letting any other application know about it, which leads to the most visible manifestation of this chaos, commonly known as .DLL hell. There’s nothing like causing a problem by creating multiple copies or overwriting reliant image versions of shared data link libraries. With the advent of the Windows Installer in Win2K, there’s finally a concerted effort to get this and other problems under control.

The fundamental concept driving Windows Installer is that the set-up or installation of an application isn’t a one-time discrete event. Rather, it’s an on-going process that must be monitored and controlled as long as the application remains a part of the system.

Currently, application installation is a grab bag of techniques. They range from sophisticated proprietary programs to simple self-extracting executables that copy files and configuration information to their appropriate locations in the directory and registry structures. The Add/Remove Programs applet in the Control Panel is the first generation of the Installer Idea, but it’s only marginally useful. Windows Installer essentially takes control of the functions necessary to place data in the proper locations for the application and the operating system to perform properly. The Windows Installer is another step forward in the process of standardizing functional layer abstractions in the operating system, which is a significant part of Microsoft’s Zero Administration initiative.

Following fundamental NT architecture, the Installer is a group of related, but abstracted components. The main Windows Installer function is implemented as a service that’s always available to respond to a particular installation transaction. This design also solves another problem—well, the result of a solution to yet a different problem. (Sometimes our solutions raise other problems.)

For example, it’s a generally accepted wise policy to lock down workstations to prevent users from installing unsupported applications or destroying workstation configuration. However, this also prevents users from installing approved applications unless they also have the appropriate permissions, a classic Catch-22. Since the Installer runs as a service, it can run under the security context of the local system account, giving it the authority and permission to install a program the user can’t. With the Windows Installer, this can also be configured granularly to apply to specific applications. This level of control isn’t available for the Installer service on NT 4.x. In Win2K, the Installer either has permission entirely to install applications, or to run in the context of the user. This obviously can defeat the lockdown of the desktop (yet another nudge towards moving from NT 4.x to Win2K).

The Hierarchy of Installer

The Windows Installer Client Install engine runs, naturally, in user mode. Its purpose is to take the installation commands from the application and pass them to the Installer service as a transaction. This transaction method records all of the files and configuration information that is overwritten, so that if the installation process doesn’t succeed, the entire process can be rolled back and the system returned to its original state. However, once the installation is complete, these rollback files are deleted. Once this occurs, the only way to return the machine to its previous state is to go through the uninstall process.

Just because the Installer service is available doesn’t mean an application will use it. The developer must write to the Windows Installer APIs that talk to the service. (Of course, several companies have published authoring tools for creating packaged applications.) [For reviews of some tools, see Mike Gunderloy’s comparison, “Software in Nice, Tidy Packages,” in the January issue.—Ed.] Fortunately Microsoft is serious about getting developers to use the Installer service; for an application to display the good housekeeping seal of approval, the Win2K certified logo, the application must support the service. This means all supported applications will follow the three-layer hierarchy the Windows Installer is based upon.

At the top of the hierarchy is a product—what needs to be installed, such as Office 2000. A product is identified and tracked by the Installer service through its product code. The instructions delivered with the product are stored in an .MSI file, usually found in the root directory of the product’s CD.

A product is comprised of individual features, defined as a standalone unit of functionality. For example, with Office 2000, Word or Excel is a feature—either of which could also include sub-features; each of the sub-features could be individually installed. If someone wrote a standalone word processor, it would be considered a separate product, and perhaps the spell-checker could be considered a feature. A feature can be shared among different products.

At the bottom of the hierarchy—and where the Installer keeps track of all the files and information—is the component. A component is a related collection of files, registry keys, and other information that must be considered a cohesive group. It’s all for one and one for all. No two components share files with each other. If a component uses a file that another component might also use, each maintains a copy of that file. For two applications to share a file, they must independently ship the same component, which is identified by a Global Unique Identifier (GUID). The first application to be installed will use the component. The second application will see the existing component and raise a counter, called a refcount, to reflect how many applications are using the component. That’s so it won’t be removed until the last application that relies on it is removed. Collecting multiple files within a component minimizes the number of unique objects that the Windows Installer needs to keep track of.

Component Contents

Since a feature is the smallest object in the Windows Installer architecture, the Installer service provides more flexibility than the simple binary selection of most setup routines. Windows Installer allows the user to choose from among four alternatives (as shown in Figure 1):

  • Run From My Computer. The files are installed on the local hard drive and run locally.
  • Run from CD. The image files are left at the CD or directory source and run from a central location.
  • Installed on First Use. This is referred to as advertising an available option. Although the feature (or application) shows up on the menu, it’s not installed until the user selects the function from the menu. This allows the user to essentially customize features from an approved list without administrator intervention.
  • Not Installed. No files are copied and the user isn’t informed of the option.
Figure 1. What the user sees when you use the Windows Installer to mandate choices for component installation.

The components contain the actual files that make up each feature of an application. Although component contents are a singular object, components can be shared across features and products. If a component is installed or uninstalled, all of the files and other objects associated with the component are installed or removed. This guarantees that if a component is referenced among multiple features or products, it always contains the same set of objects. Ultimately, the Installer Service manages applications at the component level. Since components are always uninstalled together, when an application is removed, the Installer service won’t leave file or other object litter on the system. Also, since the component is viewed as the smallest unit, the system can easily keep track of how many applications use it and can determine when the last application that depends upon it is removed.

This architecture simplifies and provides distributed on-demand installation of products and individual features of those products. The features are advertised as adjuncts to the products; but because the Windows Installer APIs are built into the Win2K operating system, entire applications can be advertised in menu systems on multiple workstations. When the user selects the advertised application, it’s installed either as the user desires or as the administrator has previously determined. Additionally, since the Windows Installer is aware of all the components on the system, it can also be used automatically to repair damaged installations as well. If a file is missing or corrupted, the Windows Installer can determine the problem and replace all the objects related to the component.

Additional Information

While not the most fascinating aspect of network support, the Windows Installer is a welcome tool to help minimize the tedious task of delivering and maintaining application support and availability. This marks it as one of the most useful features of Win2K.

Featured