Вы находитесь на странице: 1из 175

Download the original attachment

FAQs on Windows Installer

1. What is Windows Installer Technology?

The Windows Installer technology is made up of three elements that work


together:

Windows Installer Technology = Windows Installer client + Windows Installer


service + Windows Installer package (an .msi file.)

o Windows Installer client: Any application that calls Windows Installer


to perform a task (Example SMS distribution, Add Remove Programme,
Windows-based shell..etc. )
o Windows Installer service: a System service “Msiexec.exe” for installing
and managing applications.
o Windows Installer package (an .msi file.): A database file which is used
to manage the various states of the application like adding, changing, or
removing it from a computer.

2. What are the Functions provided by MSI?

The following functions are provided by the MSI

o Transactional Operations: For each operation that an MSI performs It


can undo and rollback hence System will not contain unwanted FILES
/Registries and will be more clean if uninstallation fails.
o Self Healing: MSI can detect common installation problems at launch,
like missing Files and Registries and automatically repairs them.

o Install On Demand: It supports on demand installation of application


features { like Spell Check in Words}

o Installation On Locked Down Environments:

o State Management: Windows installer provides a set of WiN32 API


which allows querying the current state, verification of the existing state,
repair of corrupted state and transition from one state to another.
o Consistent Installation Rules: Windows Installer uses consistent and
reliable version rules, which provide consistent and reliable installations
for all applications and prevent newer files from being overwritten by
older files.

3. How advertised installation is is different from a normal installation?

An advertisement installation places entry points, such as shortcuts, on the


destination computer without actually installing the application. When an
installation is opened in advertising mode, only the Execute sequences are run
because it does not have a User Interface sequence, and therefore no dialogs
appear

Command line /JU and /JM is used for that.

4. What are the Different types of Privileges during the installations can be
given?

Locked-down

o The users doesn’t have the full admin rights to install the application
o The users doesn’t have WRITE-ACCESS to the Program Files folder of
their computers or to the HKEY_LOCAL_MACHINE registry location
o Installation can be done in this environment by the approval of the
Administrator by means of GPO or Active directories, the administrator
can assign or publish the application.

Elevated rights

o An account or process that is operating or logged into the computer that


has full administrator rights or permissions.(User can install the
application but doesn’t have rights to set Group policies ).

Administrative Rights

o Highest level of permissions that can be granted to an account in Windows


NT User Manager. An administrator can set permissions for other users
and create groups and accounts within the domain. These rights are
required to install the System Files Update.

5. What is the difference between the AdminUser and Privileged properties?

The AdminUser property is set when the user performing the installation is an
administrator; the Privileged property is set when the user is allowed to install
with elevated privileges. A user can install with elevated privileges if the user is
an administrator, both the per-user and per-machine AlwaysInstallElevated
policies are set or the application has been assigned by the system administrator.

If the user is an administrator, then both the AdminUser and Privileged properties
are set. If the user is not an administrator, then AdminUser is never set. In that
case, privileged is only set if the user has been given permission by the
administrator through assignment or policy to install the application as elevated.

In many cases, it is recommended that launch conditions or similar conditions use


Privileged instead of AdminUser to allow for installation of applications assigned
by administrators.

6. Should users with user-level privileges be able to install MSI applications?

A user with user-level privileges can install managed applications if the system
administrator has enabled the installation. Otherwise, the user will only be able to
install MSI applications provided the user has permission to write files, create
directories, and write registry keys in the locations where the installation typically
writes those resources. If the user cannot write to a location, then the installer will
only be able to write to that location if the administrator has given permission for
the installer to do so.

7. What ari9i9i90e the various Installation sequences?

o User Interface: The User Interface sequence, which is executed at the


beginning of installation, gathers system information, displays dialogs to
the end user, and records end user choices. It is suppressed during silent
installations.
o Execute Immediate: In this mode the installer creates an internal script
and run then to make some system changes.

o Execute Deferred: It encompasses all the actions between InstallInitialize


and InstallFinalize

8. What are the differences between Execute Deferred and Execute Immediate?

Sr.No. Execute Deferred Execute Immediate


1The Custom Actions can be The Custom Actions can be
.sequenced between Install sequenced anywhere within any
Initialize and InstallFinalize. of the sequence tables.
2These cannot access the It has full Access to the
.installation database and has very installation database and can read
limited access to the Installation ,
SESSION, because an installation
script can be executed outside the Set installation property,
installation session that created it.
Modify features and
Components,

Add temp Column or to the table.


3These action are not executed These actions are executed first
.immediately instead they are and the necessary system changes
scheduled to run later during the are done for the installation.
execution.(Untill InstallExeute,
InstallExeuteAgain,
InstallFinalize actions are run)
4These custom actions can run in: These custom actions can run
. only in the context of the user
(i) Context of the user initiating initiating the installation
the installation.

(ii) Elevated using the system


context

9. What versions of Windows include Windows Installer?


Microsoft Windows 2000 SP3 [version 2.0]

Windows Millennium Edition (Windows Me), [version 1.2]

Windows XP include Windows Installer. [Version 2.0]

10. What is FILE association?

Linking a particular File extension with an EXE to determine which application to


launch, when the end user double-clicks that file is known as FILE association.

File associations are a type of advertising and are stored in the registry.

Example:

Registering a File Extension

If your application uses special file extensions, you might want to register them so
that the application gets started when the file gets double clicked, and that there is
an icon associated with the file. There are special tables for this in the msi
structure (Extension and ProgId) their contents are also used for advertising. In
Wise 3.5 there is even a GUI for editing the Contents of the Extensions table. No
GUI though for the ProgId table which sets up icons for file extensions.

You can also make your own registry entries to create application to file extension
relations. The example shows how to register the .dvi extensions to be opened
with the yap.exe program.

Link the extension .dvi to the DVI.Document class:

Key: HKLM\SOFTWARE\Classes\.dvi

Value: <default> = "DVI.Document"

Describe the DVI.Document class:

Key: HKLM\SOFTWARE\Classes\DVI.Document

Value: <default> = "DVI Document"

Select Icon #0 from yap.exe which is in the MSI:


Key: HKLM\SOFTWARE\Classes\DVI.Document\DefaultIcon

Value: <default> = "[!yap.exe],0"

How to open the .dvi file if it is

if it is double clicked in the Explorer:

Key: HKLM\SOFTWARE\Classes\DVI.Document\shell\open\command

Value: <default> = "[!yap.exe]" "%1"

11. How can u disable/ Hide an application from ADD/REMOVE Programme?

To hide an application from Add/Remove Programs, set the

 ARPSYSTEMCOMPONENT property to 1. (In Property table


of the package/ command line/ transform).
 ARPNOREMOVE property to 1. (Operating systems <
Windows 2000 hide from add /Remove)
 ARPNOREMOVE property to 1. (Operating systems >=
Windows 2000, will just disable the remove button from
Add/remove Programs )

12. What is Per User and Per Machine installation?

Per-machine Installations Per-user Installations


Shortcuts are installed to the All Users Shortcuts are installed only to that
profile users' profile
COM registration is always written to On Windows 2000, COM
HKLM\Software\Classes registration is written to
HKCU\Software\Classes
Icons and transforms are stored in Icons and transforms are stored in
%WINDOWS%\Installer\ %USERPROFILE%\Application
{ProductCode}. Data\Microsoft\Installer\
{ProductCode GUID}

13. Determine all the values of the ALLUSERS property set in the MSI file?
The following tables illustrate how the property affects the application installation
when combined with the access privileges of the user and the type of operating
system. You can ensure the ALLUSERS property has not been set by setting its
value to an empty string (""), ALLUSERS="".

Windows NT/ ALLUSERS is not ALLUSERS = 1 ALLUSERS =


set. 2
Windows 2000 (ALLUSERS="")
User access Per-user installation Not valid; returns Per-user
privileges. using folders in an error stating installation
user's personal the user does not using folders in
profile. have enough user's personal
access privileges profile.
to install
application.
Administrator Per-user installation Per-machine Per-machine
access privileges. using folders in installation using installation
user's personal folders in "All using folders in
profile. Users" profile. "All Users"
profile.

The best practice is to set the ALLUSER property =1 because if the application
is to be installed to per machine and a user without admin access try to install
that it will prompt an error but in the other cases it will be a peruser installation
without any prompts.

Default Value: If ALLUSERS is not set, the installer does a per-user installation.

Remarks

It is strongly recommended that developers do not author packages that set the
ALLUSERS property using a dialog or custom action on Windows 95 or
Windows 98. An upgrade may fail on Windows 95/98 if the ALLUSERS property
is set using a dialog or a custom action. On Windows 95/98, the installer ignores
any attempt to set ALLUSERS by either the command line or by the

vertised per-machine by a member of the Administrators group

o Assigned or published on Windows 2000 and later by an Administrator


o Marked as managed by another software and deployment management
system
The exact method depends on the management system used, but generally requires
an administrator's action.

Note that "managed"[these are managed by administrators so that they can be


installed on users PC] is different from "elevated." An elevated application is an
application that can run with system privileges when installing. All managed
applications are elevated, but applications can be elevated without being managed
by means of the AlwaysInstallElevated policy. Due to its security implications,
this policy is disabled by default and requires careful consideration before use.

15. What is application ISOLATION?

ISOLATION is a method in which the application Files (DLLs/OCX) are also


copied to application Folder rather then the common folder location like system32
,System and a .EXE.local file of 0 KB is created which make the exe to look in
the application folder rather then the SHARED location which ensures more
application stability and less no. of conflicts.

16. What is the difference between SNAPSHOT and SMARTMONITOR?

SNAPSHOT SMARTMON
ITOR
It records all the changes which happen after and before It monitors and
installation and put in the Repackaged File records the
installation
operations as
they happen
u…………………………………………………………… SMARTMONI
…..lkoiu8ikokl876uiol/jhu80-[jhlku= TOR captures
.n0=] all the
,mnjh/.lkju8 changes,
Replacing files
even if they
are the same
size,
modification
date, and
version.
,Setting or
deleting a
registry value,
creating or
deleting a
registry
key.
,Overwriting
existing
registry keys
with the same
value
INI file Handling: If it is Windows Directory, changes to it INI file
are recorded as an .INI file change Handling:
Can add as INI
Outside windows Directory: the entire .INI file is added file entry
instead of just editing the file irrespective of
the location
It takes more time as it requires scanning of the computer Since it is a
states after and before installation monitoring
process it takes
less time in
comparison
with
Snapshot.
It cannot
monitors the
application
designed for
Windows -16
Bit

17. What is the difference between COMPONENT and FEATURE?

COMPONENT can be defined as a logical container with a UNIQUE GUID


which contains Files/registries/shortcuts/advertising info.

FEATURE COMPONENT
A part of the applications total Basic building Block of a MSI
functionality that a user may decide to which is a collection of Files,
INSTALL independently. registries, Advertising info..etc..
It doesn’t have a unique GUID It has a unique COMPONENET
GUID
Examples:SPELL Checker, Shared piece of code, DAO, MFC,
Thesaurus, CLIP ART COM objects

18. What is install on demand?

Windows Installer does not install the necessary components until a user or
application attempts to activate the advertised program. This concept is called
install-on-demand.

19. What is meant by Advertisement in an MSI?

The availability of an application to a user without actually installing the


application, only the interfaces required for loading and launching the
applications are presented to the User, providing the functionality without loading
the files.

With the help of advertisement INSTALL ON DEMAND is feasible.

20. What is the minimum requirement for a Windows OS to support the


Advertisement in applications?

Platform Advertisement Support


Windows 2000 and later and Advertisements are supported.
Windows 98 and later.
Windows NT 4.0 and Advertisements are supported, only if this
Windows 95 additional requirement is met:

Internet Explorer 4.01 Service Pack 1 with


Active Desktop installed. (It is not
necessary to enable Active Desktop, just
install it.) Minimum SHELL32.DLL
version should be 4.72.3110.0
21. What do mean by Resiliency?

The ability of an application to recover gracefully from situations in which a


VITAL component is missing or has been replaced by an incompatible version is
known as RESILIENCY

22. What is Source resiliency?

The Windows installer provides Source resiliency for ON DEMAND installation


of features. If the Source location changes or get DAMAGED The source list
contains the source locations that Windows Installer searches for installation
packages. The source location entries are in the form of a mapped drive letter,
Universal Naming Convention (UNC) path, Uniform Resource Locators (URLs),
or physical media such as compact discs. If one source fails, Windows Installer
tries the next

The Property SOURCEDIR (SOURCELIST is different) contains the path of the


last successful installation path

23) What is a transform?

A transform is a .mst FILE which encapsulates all the changes to a base msi and hence it
enables to maintain a SINGLE installation FILE and changes separately in the
TRANSFORM file

24) What are the ways to make the changes in an MSI during installation?

The most generally used to make customizations in an MSI are

TRANSFORMS and COMMANDLINES

Difference between them are :

Command Line TRANSFORMS


1) We can change only the PUBLIC 1) This can affect both the PUBLIC and
properties with this PRIVATE properties

2) It cant affect the registries but can 2) It can affect Files/registries/Directories


modify the Files and Directories …
3) Group policy based Deployment 3) It can be done here
customizations cant be done with
command lines

25) What is the command line option for applying two or more TRANSOFMS to a
Single MSI?

Msiexec /I \\server\installation\my .MSI /Qb!


TRANSFORMS=common.mst;Group.mst

26) What are the reasons for self healing in an Application? An Application Keeps
on Reinstalling every time you click the shortcut. How to resolve.

.Go to eventviewer and check for Component ID. It may be missing or some error related
to that....fix it. Other options are….

Missing Files or Registry Keys


Look closely- some files are deleted by the application itself. If your package contains
such a file it will self-heal in order to restore the file each time.
Temporary Files Included In MSI
If any temporary files left on the system are captured in your package, they may cause
self repairs to occur in order to restore them.
Correct Path for the components.
Sometimes the component will have a wrong directory path so right click each and every
component and check for the directory.

HKEY_CURRENT_USER Keys in Package [Obvious]


HKCU Keys are installed only for the current user. Therefore, the first time the
application is run by each user, the HKCU keys belonging to the package will not exist
resulting in a reinstallation of the containing feature.
27) What are PUBLIC,PRIVATE and RESTRICTED properties ?

PUBLIC PROPERTY:

1) They are in always in CAPITAL LETTERS

EX: INSTALLLEVEL, ALLUSERS, ROOTDRIVE, TARGETDIR

2) These CAN BE CHANGED BY USER OR SYSADMIN THROUGH


COMMAND LINE

OR TRANSFORM

3) These CAN BE OVERRIDDEN by THE COMMAND LINE


4) PROPERTIES THAT ARE SET DURING INSTALLATION AT USER
INTERFACE SHOULD BE PUBLIC

PRIVATE PROPERTY:

1) They MUST INCLUDE LOWER CASE LETTERS

EX: WindowsFolder, SourceDir, VersionNT

2) These CANNOT BE CHANGED BY USER OR SYSADMIN THROUGH


COMMAND LINE

3) These are used internally by the installer and their values must be entered into
the database by the author of the installation package or set by the installer during
the installation to values determined by the operating environment.

4) The Private properties commonly describe the operating environment. For


example, if the installation is run on a Windows platform, the installer sets the
WindowsFolder property to the value specified in the Property table

REQUIRED PROPERTIES:

1) Properties mandatory for installation to work.

EX ProductCode; ProductLanguage; ProductVersion;


ProductName;Manufacturer.

RESTRICTED PUBLIC PROPERTY:

There are certain conditions where SystemAdmin can exert control over the
PUBLIC properties so that a user with an elevated privileges can’t modify or access
them so as to maintain secure systems these properties are know as Restricted
PUBLIC PROPETIES
28) What changes (PROPERTIES) u will make to ensure that a particular feature
should be installed in the system during installation?

Check the INSTALLLEVEL Property

The INSTALLLEVEL property is the initial level at which features are selected "ON" for
installation by default. A feature is installed only if the value in the Level field of the
Feature table is less than or equal to the current INSTALLLEVEL value. The installation
level for any installation is specified by the INSTALLLEVEL property, and can be an
integral from 1 to 32,767.

29) IMPORTANT PROPERTIES OF AN MSI FILE

Property Name Description


TARGETDIR Location to which the installation package is copied during an
administrative installation.

ADDLOCAL EX: msiexec /a D:\setup.msi TARGETDIR=\\server\share

ADDSOURCE List of features to be to be installed locally.


ADDLOCAL=All on the command line
ADVERTISE
List of features to be run from the source

REINSTALL List of features to be advertised ( Never set properties


ADDLOCAL,ADDSOURCE and ADVERTISE = ALL in
the property table , it will not uninstall properly )

List of features to be reinstalled

If you set the REINSTALL property, you must also set the
REINSTALLMODE property, to indicate the type of
reinstall you want. When the REINSTALLMODE property is
not set, all files currently installed are reinstalled, but only if
the file on the computer is an earlier version or is not present.
By default, no registry entries are rewritten if REINSTALL is
set to ALL, only features already installed are reinstalled
Thus, if REINSTALL is set for a product that is yet to be
installed, no installation takes place. REINSTALL is a vital
property for performing such important tasks such as patching
and upgrading software
REBOOT Suppresses certain prompts for a restart of the system
Force: Always prompt for a computer restart at the end of the
installation. The UI prompts the user to restart at the end. If
there is no user interface, the system restarts at the end of the
installation

Suppress: Suppress restart prompts at the end of the


installation. During installation, Windows Installer prompts
the user to restart whenever it encounters ForceReboot set by
the application vendor

ReallySuppress : Suppress all restart prompts that


ForceReboot initiates during the installation and also suppress
all restart prompts at the end of the installation.
REBOOTPROMPT Suppresses the display of computer restart prompts to the user.
Any restarts that are needed happen automatically.

Setting the REBOOTPROMPT property to Suppress (or


S) allows Windows Installer to perform a computer
restart, if necessary, without prompting the user

30) What are ICE Errors, how do we resolve it?

Internal consistency evaluators, also called ICEs, are custom actions written in
VBScript, Script, or as a DLL or EXE. When these custom actions are executed, they
scan the database for entries in database records and check the MICROSOFT
STANDARDS and indirectly predict the application stability in an MICROSOFT
ENVIRONMENT

31) What is LaunchConditions Action and How will you check whether an
operating system is an WINDOWS XP or not before installing the application ?

LaunchConditions Action

The LaunchConditions action queries the LaunchCondition table and evaluates each
conditional statement recorded there. If any of these conditional statements fail, an error
message is displayed to the user and the installation is terminated.

Commonly used launch condition is VersionNT


VersionNT property identifies the exact type or "flavor" of Windows your setup is
running on. Putting the same in the Launchconditions we can detect the operating system
prior to installation

Operating System (A)


Windows NT 4.0 Workstation 400
Windows NT 4.0 Domain Controller 400
Windows NT 4.0 Server 400
Windows 2000 Professional 500
Windows 2000 Domain Controller 500
Windows 2000 Server 500
Windows 2000 Advanced Server 500
Windows XP Home Edition 501
Windows XP Professional 501
Windows .NET Domain Controller 501
Windows .NET Standard Server 501
Windows .NET Enterprise Server 501

32) What is the Difference between MST and MSP?

Both MST and MSP are used to make changes in MSI package But main differences
between both of them

MST MSP
1) This is a File which contains the changes 1) It is basically the FILE from which
in a BASE MSI changes to an already installed application is
done

2) Transform cant be installed individually 2) Patch can be installed individually, if the


without an MSI previous MSI is existing in the system

33) What is the difference between UPDATE and UPGRADE?

UPDATE UGRADE
1) This is a minor enhancement or BUG in 1) IT is removing the older application
a SOFTWARE which can make few completely and installing a NEW one
changes of FILES or Registries
2) The Overall functionality of the 2) The functionality is modified and New
application remains almost the same features may be added and higher File
except few changes versions are generally added to the
application

3) Hot Fixes, new Driver application 3) Wise package studio 5.0 and Wise
related to printers are examples of updates package studio 6.0 are the examples of
upgrades

A small update or a minor upgrade can affect applications in the following ways:

• Enlarge or reduce the feature component tree, without reorganizing the existing
hierarchy of features and components described in the table of feature
components.
• Add a new feature to the existing feature component tree.
• Remove a parent feature, including all the child features of each parent feature.
• Add a new component if the component is associated with a new feature.
• Change the tables, custom actions, and dialogs in the .msi file without changing
the file name. (Renaming the *.msi modifies the package, which also changes the
package code.)
• Add, modify, or remove files, registry keys, or shortcuts for components that are
not shared among features.

34) What are the BEST PRACTICES recommended by Microsoft in creation of


Package?

Some of the best practices are :

• Follow the components rules: Dont mix user and machine specific entries in a
single component. Ensure that only one .exe exists in each component. Ensure
that components are UNIQUE i.e. dont have a .dll that exists in more than one
component.
• Dont use Custom Actions to make any critical system changes. Anything done
in a custom action doesnt have any rollback capability, so if your install goes 'pear
shaped' you cant roll back changes made during a custom action.
• Generate Merge Modules (MSM's), for any common components, and use the
Merge Module in any application that requires the component. Try to source and
use commercially produced Merge Modules if you can. If you can't (and you wont
be able to for most things...) then produce your own....
• Ensure that all user specific parts of the install i.e. all HKEY_CURRENT
_USER registry entries, are contained in a separate component. When a new
user logs into a machine, the self-heal functionality of MSI will detect a missing
component in the users profile, and will populate the users registy with the
settings for the application in question
• Ensure that any INI file changes are recorded in the INI file table, rather than
just as files in the file table. This will ensure that INI files are edited if they exist
already, rather than replaced with the version within the MSI Package
• Make custom configuration changes using Transforms (MST's), rather than by
editing the MSI itself. This will make it easier to produce 'generic' packages that
can be modified for several environments.
• Set the Property ALLUSERS = 1 in the property table. This will force the
application to install for all users, if installed under an Admin account, and to
Current User, if using a non-admin account...
• Set the Property ROOTDRIVE = C:\ in the property table - This will force
applications to install to drive C:\. Otherwise, if you have more than one drive in
the target machine, MSI will look for the one with most free space. this means
you cant always guarantee when your applications will install to.
• Be sure to generate a new Product ID for each application - otherwise you will
encounter installation problems when trying to install more than on MSI
application on a single machine.
• Set the property REBOOT = Force in the property table to force a reboot at the
end of the installation - if one is required.
• In the registry table, anything enclosed in square brackets [ ] is assumed to be an
MSI property, and Windows Installer will attempt to resolve it. Whilst this is
often quite useful, sometime you WANT to have square brackets in a registry
value. To acheive this use the following syntax: [\[[<mystring>[\]]

35) How do we give permissions to file or registry?

We can be give the permission to a USER using the following : Using cacls

Displays or modifies access control lists (ACLs) of files

CACLS filename [/T] [/E] [/C] [/G user: perm] [/R user [...]]

[/P user: perm [...]] [/D user [...]]

filename Displays ACLs.

/T Changes ACLs of specified files in

the current directory and all subdirectories.


/E Edit ACL instead of replacing it.

/C Continue on access denied errors.

/G user:perm Grant specified user access rights.

Perm can be: R Read

W Write

C Change (write)

F Full control

/R user Revoke specified user's access rights (only valid with /E).

/P user:perm Replace specified user's access rights.

Perm can be: N None

R Read

W Write

C Change (write)

F Full control

/D user Deny specified user access.

36) How do we create images using a ghost image which is for a particular System,
for Eg : for Dell pc, but need to install on different Hardware configuration like
IBM pc or some thing, how do we install the drivers et....

1) Create the perfect XP image on ANY hardware. (We used a Dell Optiplex GX240).
2) Dump the image to the imaging server.
3) Image a different computer using that same image(Dell) even though the target is a
different computer with different HAL driver( We used an IBM 300GL). At this time you
would normally restart the computer and find out there is a different HAL and hard drive
drivers, video drivers and images are not compatible on computers that use a different
hal.
4) Turn on CD-ROM boot capability on your PC if it is not already active.
5) Reboot the computer with your Windows XP PRO CD inside it.
6) At the first prompt when it asks you if you want to repair or new install select new
install.
7) When it detects an XP installation has already occurred, it asks again if you want to
repair it or do a fresh install. CHOSE REPAIR.
The second repair scans the hardware information and recopies the files
ACCORDING TO THE
HARDWARE SCAN not the image that you sent down. All sound, video, HAL, hard
drive, chipset are
copied into the correct place.
8) enter a valid license, and restarting the machine this is what we saw:

Network loaded up perfectly on the first boot with Novell client even though the NIC
card was completely different than the image we put on, Auto Login still worked,
application launcher worked, Client trust and internet worked. Even the user's profiles
were still 100% intact. Everything about the image worked as if it was a perfect clone
including video, sound, USB, everything! . Only a few extra shortcuts were on the start
bar. We are now looking into weather or not we need to reapply Windows XP SP1a and
some other windows updates( I imagine we will). All software that was installed and
configured in the previous image loaded without problems. It was a dream come true and
only took us 40 minutes to complete.

9) check over XP and make sure everything is ok and dump the new image.

We haven't checked all of the registry hacks we had in the original image, but we know
some took fine through the repair.

We are deploying XP by using ghost to clone 600 workstations with 7 different computer
hardware configurations with a clean image. With this method we will only make 1
image, load it to another computer, repair it, then dump it back to the server to load to the
other workstations. It will save us from making 7 separate images from scratch when all
of the workstations need to have the same look, feel, and base software.

If you have a different way of doing this I would love to hear about it. I'm always looking
for better ways of doing things. I tried messing with Hal drives and device drives between
images and never got it running right. This way, it is automatic and nearly 100%
accurate.

Note:

1)
HKLM\SOFTWARE\MICROSOFT\WINDOWSNT\CURRENTVERSION\WINLOGO
N

DEFAULTDOMAINNAME = WORKSTATION NAME


Anytime we change the workstation name this setting has to be changed or you can't
login. The workstation name and this registry key have to be the same, unless you have a
windows domain for it to contact. (SYSPREP set the default m\c name)

2) Sysprep is a great tool to reduce the number of images. However, at the time Sysprep
is run, all drivers including INF files must be present on the machine. When the
Sysprep'd image is restored, the Sysprep mini-setup will perform a hardware discovery
and will only discover drivers that were present on the machine when Sysprep was
originally run. This means that as new hardware is purchased or new drivers are required,
the base image must be recreated, drivers added, Sysprep run and every platform using
the base image must be tested.

37) What are the benefits of Patch?

An application that has been installed using the Windows Installer can be upgraded by
reinstalling an updated installation package (.msi file), or by applying a Windows
Installer patch (an .msp file) to the application.

Benefits of using patch, rather than a complete installation package for the updated
product can have the following advantages:

• A patch can contain an entire file or only the file bits necessary to update part of
the file. This can enable the user to download an upgrade patch that is much
smaller than the installation package for the entire product.
• An update using a patch can preserve a user customization of the application
through the upgrade
• Skip actions associated with specific tables that are unmodified by the patch. This
can significantly reduce the time required to install the patch
• Create and install patches that can be uninstalled singly, and in any order, without
having to uninstall and reinstall the entire application and other patches.

38) What are the points to be remembered during installing of a PATCH?

DO not perform a silent install of an MSP file like this:

Msiexec /p patch.msp /qn

it will not patch an existing installation. It will only update the locally cached copy of
the MSI database. Use this command line instead:

Msiexec /p patch.msp REINSTALL=ALL REINSTALLMODE=omus


Double-clicking the .MSP file will patch an existing installation as well as the locally
cached copy of the MSI database because the dialogs are run and they in turn set
REINSTALL and REINSTALLMODE for you. When you run the patch unattended, the
dialogs are not displayed and the properties are not set. This is why the properties must
be set at the command line

39) What are the different HIVES in the registry?

Folder/predefined key
Description
HKEY_CURRENT_USER Contains the root of the configuration information
for the user who is currently logged on. The user's
folders, screen colors, and Control Panel settings
are stored here. This information is associated with
the user's profile. This key is sometimes
abbreviated as "HKCU."
HKEY_USERS Contains all the actively loaded user profiles on the
computer. HKEY_CURRENT_USER is a subkey
of HKEY_USERS. HKEY_USERS is sometimes
abbreviated as "HKU."
HKEY_LOCAL_MACHINE Contains configuration information particular to the
computer (for any user). This key is sometimes
abbreviated as "HKLM."
HKEY_CLASSES_ROOT Is a subkey of
HKEY_LOCAL_MACHINE\Software. The
information stored here makes sure that the correct
program opens when you open a file by using
Windows Explorer. This key is sometimes
abbreviated as "HKCR." Starting with Windows
2000, this information is stored under both the
HKEY_LOCAL_MACHINE and
HKEY_CURRENT_USER keys. The
HKEY_LOCAL_MACHINE\Software\Classes key
contains default settings that can apply to all users
on the local computer. The
HKEY_CURRENT_USER\Software\Classes key
contains settings that override the default settings
and apply only to the interactive user. The
HKEY_CLASSES_ROOT key provides a view of
the registry that merges the information from these
two sources. HKEY_CLASSES_ROOT also
provides this merged view for programs designed
for earlier versions of Windows. To change the
settings for the interactive user, changes must be
made under
HKEY_CURRENT_USER\Software\Classes
instead of under HKEY_CLASSES_ROOT. To
change the default settings, changes must be made
under
HKEY_LOCAL_MACHINE\Software\Classes. If
you write keys to a key under
HKEY_CLASSES_ROOT, the system stores the
information under
HKEY_LOCAL_MACHINE\Software\Classes. If
you write values to a key under
HKEY_CLASSES_ROOT, and the key already
exists under
HKEY_CURRENT_USER\Software\Classes, the
system will store the information there instead of
under
HKEY_LOCAL_MACHINE\Software\Classes.
HKEY_CURRENT_CONFIG Contains information about the hardware profile
that is used by the local computer at system startup

40) Explain the PACKAGING LIFE CYCLE?

New Request

Technical Review

Defining the complexity

Application packaging

Quality Analysis

Dispatching the package

UAT

41) You just need to make some changes to a MSI, you have to save it not compile
it.Which tool will you use?

ORCA Tool can be used for the same purpose

42) MS Packages. How to package it? Any MS tool?

The Microsoft tools used for packaging are:


• Microsoft® Visual Studio® Installer
• MsiDb.exe tools for comparing
• ORCA for editing

43) What is dll cache and what is its use and what you mean by WFP (Windows File
Protection) ?

WFP : The windows file protection service is an "invisible" service that is enabled by
default and runs constantly in the background after a successful logon. (It does not load in
safe mode.) . It helps in retaining the Critical files of the system by restoring them when
they are Overwritten or deleted from special folder called dllcache. The location of this
file is:

%SYSTEMROOT%\system32\dllcache .

This is one of the solution to the DLL HELL Problems in Windows OS

44) Can we replace a Windows Protected file through package?

It is no feasible to replace the protected File through package, currently the only
applications capable of updating WFP files are:

Hotfix.exe for hotfix installations

Windows updates

Win32.exe for operating system upgrades

Update.exe for hotfix and service pack installations

45) How do I create a shortcut that uninstalls my .MSI based application and
include it in my installation?

Create a command line shortcut to uninstall the application and include the the shortcut in
your installation (command Line)

Command Line:[SystemFolder]msiexec /x {product code}

Systemfolder: It is an installer property it set s the path to the system folder For
example, on 32-bit Windows the value may be C:\Windows\System32. On 64-bit
Windows, the value may be C:\Windows\SysWow64
46) How you can detect between an admin installed(Uncompressed msi) MSI and a
compressed one ?

Sourcetype property ( = 2 for compressed =4 for uncompressed )

47) What are the file versioning rules for Microsoft installer?

File Versioning Rules:

The Windows Installer uses an even more complex algorithm when deciding

Whether to keep an existing file or install a new copy. It takes into account not just

the file dates and the version, but the languages involved as well. Here’s the set of

rules the Windows Installer follows:

Highest version wins. All other things being equal, the file with the highest

version number wins, whether that’s the file on the hard drive or the file in the

source media.

Any version is higher than no version at all. If the copy in the source media

Contains version information, and the copy on the hard drive has no version

Information, Windows Installer chooses the one with the version information.

Favor the new language. All other things being equal, if the file being

installed is localized for a different language than the file on the computer, Windows

Installer uses the copy with the language that matches the product being

Installed.

Meet the product’s needs for multiple languages. If both copies support

Multiple languages, Windows Installer ignores the common languages and uses

the copy that supports the most languages out of the set of languages that the

Product uses.

Keep the maximum number of languages. If the copies differ in the number
of languages they support and both support all the languages that the product

needs, Windows Installer keeps the copy that supports the most languages.

Treat non-versioned files as user data. If there is no version information for

either copy, Windows Installer compares the file creation date and the last modification

Date for the file on the computer. If the modification date is later than

the creation date, Windows Installer assumes this file has been customized by

the user and does not overwrite it. Otherwise, it installs a new copy.

Companion files go along with the versioned file. It’s possible to mark a

file within the Installer database that does not include version information as a

companion file to a file that does include version information. In this case, the

companion file is installed if the other file is installed. There is one exception to

this rule, though. If the companion file is not present on the target machine, it’s

Installed even if the versioned file is not installed.

48) How will you change the MSI default icon to some other ICON?

HKCR\msi.package\Default icon change entry to new ico file.

49) What are the applications which should not be repackaged?

1) Vendor MSi: because UPGRADES cannot be applied if repackaged

2) Windows Media Player, anti-virus software, and device drivers: because


applications make low-level changes to the operating system involving Windows File
Protection

3) Service packs, OS security updates, Internet Explorer, MDAC, or the


Windows Installer service: MDAC is merge module and the rest of the Applications
break Windows security rule (Windows protected files are overwritten) hence can’t
be repackaged
50) What is Active SETUP? In which conditions it is used or How will the package
install if it does not have advertised feature

Active setup is a process that runs automatically when a user logs in.

Registry keys at

HKLM\Software\Microsoft\Active Setup\Installed Components\%APPNAME%

and

HKCU\Software\Microsoft\Active Setup\Installed Components\%APPNAME%

are compared, and if the HKCU registry entries don't exist, or the Version number of
HKCU is less than HKLM, then the specified application is executed for the current user.

If your application requires installation of components such as files or registry keys on a


per-user basis, but your application has no advertised entry points or other triggers to
initiate the installation process, then Active Setup is the solution.

To implement Active Setup, you need to package your entire user Installation
requirements into an EXE preferably, using SMS Installer, or Wise Installation System
for example, and place the EXE on the client workstation during the main application
installation process.

In addition, populate the following registry key with two ( REG_SZ ) values:

KEY:

HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\%APPNAME


%-

where %APPNAME% is an arbitrary string which can be the application name,

or its product code GUID. As long as it is unique on that workstation!

VALUE1:

StubPath=<full local path>\YourActiveSetup.exe

VALUE2:

Version=1
When each new user logs on, the operating system compares Active Setup keys between
HKLM and HKCU, and runs the nominated executable if the HKCU entry is missing or
the version in HKCU is less than HKLM.So if you ever need to update the ActiveSetup
executable, just install a new version, and increment the Version registry key (VALUE2
above) in HKLM. Next time the user logs on, the active setup will run again for that user

51) What are the command line switches are supported in MSI?

/i [package] Installs the specified product

/f p,o,e,d,c,a,u,m,s,v

p - Reinstalls a product only when a file is missing

• o - Reinstalls a product when a file is missing or an older version of a file is installed

• e - Reinstalls a product when a file is missing or an equal or older version of a file is


installed

• d - Reinstalls a product when a file is missing or a different version of a file is installed

• c - Reinstalls a product when a file is missing or the stored checksum value doesn’t
match the calculated value

• a - Forces all files to be reinstalled

• u - Rewrites all required user-specific registry entries

• m - Rewrites all required computer-specific registry entries

• s - Overwrites all existing shortcuts

• v - This switch forces the installation to ignore the cached MSI package on the machine
and recache the new package being run. This should only be used in an upgrade and not
with a first-time installation.

/a [package] Installs a product on the network

/x [package] Uninstalls a product

/j u,m [package] Advertises a product. u is current user; m is all users

/l i,w,e,a,r,u,c,m,p,v,+,![log file]

• i - Status messages
• w - Non-fatal warnings

• e - All error messages

• a - Action startups

• r - Action-specific records

• u - User requests

• c - Initial User Interface (UI)

Parameters

• m - Out-of-memory

• p - Terminal properties

• v - Verbose output

• + - Appends to the existing file

• ! - Clears each line in the log file

• * - Wildcard. Logs all information, but

the use of the v option isn''t included. To include the v option, type "/l*v"

/p [patch] Applies a patch. To patch an installed Administrator image, you should also
use the /a switch

/q n,n+,b,b+,b!,r,f

• n = No UI

• n+ = No UI except modal dialog at end

• b = Basic UI

• b! = Basic UI w/no Cancel button

• b+ = Basic UI w/modal dialog box at end

• b- = Basic UI w/no modal dialog box at end

• r = Reduced UI
• f = Full UI

/y Calls system API DLLRegisterServer to register the module

/z Calls system API DLLRegisterServer to un-register a module

52) What is a MERGE MODULE?

Merge modules are pre-compiled libraries of components (files, registry changes,


and other system changes) that install a discrete portion of your application. They
cannot be run alone, but must be merged with an .MSI.

Points about the merge modules:

1. All the information required to install a shared file is delivered to the installer in a
single, standardized .msm file,

2. Eliminate many instances of version clashing, missing registry entries, and improperly
installed files.

3. If shared files are installed from .msm files, the Windows installer can keep a correct
reference list of applications that use those shared files.

4. Windows can better avoid deleting shared resources used by any application until the
last application using them is uninstalled.

5. Traditional installers keep an incremental reference count of the number of


applications using a shared file, but not the name of the application.

53) What are the Windows Installer File Extensions?

There are several files type that can be created for the Windows Installer technology:

.MSI : Windows Installer Database


.MSM : Merge Module
.MSP : Windows Installer Patches
.MST : Windows Installer Transform
.IDT : Exported Windows Installer Database Table
.CUB: Validation Modules
.PCP: Windows Installer Patch Creation File

A .MSP is a Windows Installer patch file used to distribute small updates of .MSIs.
A .MST is a Windows Installer transform file that makes changes to a pre-existing .MSI.

A .IDT is an Exported Windows Installer database table which can be removed from one
database and imported to another database.
A .CUB is a Validation Module that contains Internal Consistency Evaluators in a
database which in turn evaluates databases.
A .PCP file is a Windows Installer patch creation file that contains the configuration
information that patchwiz.dll requires to create a patch.

54) What are the different types of UPGRADES?

The different types of UPGRADES are: small update, Minor upgrade and Major Upgrade
and the following Changes are done during the upgrades

Significant Differences Among Small Updates, Minor Upgrades, and Major


Upgrades

Type of ProductCode ProductVersion


Renewal Property Description
Property
Small No change No change An update to one or two files that is too
update small to warrant changing the
ProductVersion. The package code in the
Revision Number Summary property
does change. The manufacturer can ship
the product as a patch package or as a
full product installation package.
Minor No change Change A small update that involves changes
upgrade large enough to warrant changing the
ProductVersion property. The
manufacturer can ship the product as a
patch package or as a full product
installation package.
Major Change Change A comprehensive update of the product
upgrade warranting a change in the ProductCode
property. The manufacturer can ship the
product as a patch package or as a full
product installation package.

55) What are the steps for a MAJOR UPGRADE ?

Steps for Major Upgrades:


1. Generate a new Product Code

2. Ensure that the UpgradeCode Property value of new package is the same as the
previous versions

3. Generate a new package Code

4. Ensure that the Upgrade Table has the following values:

Upgrade Code : Same as the previous version . The UpgradeCode property in this
column specifies the upgrade code of all products that are to be detected by the
FindRelatedProducts action.

VersionMin: The version of the previous package

Version Max: The version of the new package. VersionMax must be a valid product
version as described for the ProductVersion property. Note that Windows Installer uses
only the first three fields of the product version. If you include a fourth field in your
product version, the installer ignores the fourth field.

Language: If Language is null or an empty string (""), FindRelatedProducts ignores


msidbUpgradeAttributesLanguagesExclusive and detects all languages.

Attributes : This column contains bit flags specifying attributes of the Upgrade table.
Usually 261.To cause uninstall to occur, the msidbUpgradeAttributesOnlyDetect bit in
the Attributes column of the Upgrade table for that product version must be off.

ActionProperty When the FindRelatedProducts action detects a related product installed


on the system, it appends the product code to the property specified in this field. The
property specified in this column must be a public property and the package author must
add the property to the SecureCustomProperties property. Each row in the Upgrade table
must have a unique ActionProperty value
5. Ensure that RemoveExistingProducts is sequenced after InstallInitialize in the
InstallExecuteSequence Table

If you want a custom action to run during an uninstallation of the product, but not during
the removal of the product by a major upgrade, use this condition.
REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE

56) Explain Self-reg table

SelfReg Table

The SelfReg table contains information about modules that need to be self registered. The
installer calls the DllRegisterServer function during installation of the module; it calls
DllUnregisterServer during uninstallation of the module. The installer does not self
register EXE files.

The SelfReg table has the following columns.

Column Type Key Nullable


File_ Identifier Y N
Cost Integer Y

56) How will you register a file without including the SelfReg table entries?

With the help of WiseCom capture tool we can capture the entries and merge the
same in the application

57) Whish File is used BY ORCA Tool to validate the custom actions? HP- question

ICEs are stored in a special file with the same structure as any other Installer database.
By default, this file uses the extension .cub

The various files used for validation are : C:\Program Files\Orca

darice.cub

logo.cub

mergemod.cub, open the .cub file in ORCA and view the details
A .cub file contains only the ICEs and their required tables. A .cub file cannot be
installed and is used only to store and provide access to ICE custom actions.

Orca or the validation tool msival2 uses the Logo.cub, Darice.cub, and

Mergemod.cub files. The set of ICEs in the Logo.cub file is a subset of those in the

Darice.cub file. If your package passes validation using Darice.cub, it will pas

pass with Logo.cub. Mergemod.cub contains a set of ICEs used to validate merge
modules.

58) How many type of ORCA ice errors are there?

The Windows Installer SDK includes 71 standard ICEs, numbered from ICE01

Through ICE73 (for some reason there is no ICE37, and ICE11 appears to be
undocumented and uncalled).

59) What are the ICE errors you have resolved during packaging?

1. The component cant be advertised because the keypath type disallows it


(Empty components , delete them)
2. Particular components INSTALLS to a USER profile it must use a reg
under HKCU as its keypath not a FILE ( move the File to CurrentUser
Component)
3. File matching patterns *.ISU ( setup related file are captured)
4. Particular componrnt having both per user and per machine data with per
machine keypath ( move the reg to current user)
5. Invalid Identifiers ( Different language applications ..French,Japanese..etc)

60) Why are my files not being removed during uninstallation?

A. There are four common reasons for why files may not be removed during
uninstallation:

• The components to which these files belong are marked as permanent. (This is done
through the Attributes column of the Component table.)
• None of the components to which these files belong have component GUIDs. (The
value for the component in the ComponentId column of the Component table is NULL).
Components without GUIDs are not managed by Windows Installer.

• If the keypath of the component has a shared DLL refcount, then the component will
not be uninstalled.

• If the component is installed in the system folder and at the time of uninstallation there
is an external shared DLL refcount for any one file in the component, then the component
will not be uninstalled.

61) How can u enable the VERBOSE logging file for an USER?

To generate a detailed verbose log file through policy, use the following registry key:

• HKLM\Software\Policies\Microsoft\Windows\Installer

• Set: Logging = REG_SZ voicewarmup

• Set: Debug = REG_DWORD 0x7

Log files generated through the policy key will be of the form msiXXXXX.log in the
user's %temp% folder.

62) In Which conditions you can update a custom action via a patch?

Yes, you can update a custom action using a patch. If the custom action is included in the
Binary table, then simply update the custom action in the update installation image.
When you generate the patch between the original and update installation images, the
patch will contain a database transform that will transform the old binary data stream to
the new binary data stream

63) How do I create a second transform that includes different files than the original
transform without overwriting the .cab file from the original transform?

Follow these steps to create multiple transforms with different cabinet files:

1. After compiling the first transform, Wise will create a cabinet file with a system-
generated name, such as "WISETRFM_2.cab". Rename the file to a name you specify,
such as "mycab1.cab".

2. In the Setup Editor, select the Tables tab, then select the Media table to modify the
name of the cabinet file that was created when you compiled (WISETRFM_2.cab). In the
Cabinet column, rename the cab file to the name you specified - "mycab1.cab".

3. After you have renamed the cabinet file associated with transform in the Media table,
recompile the transform.

Using unique names for your cab files, complete these same 3 steps each time you add a
new transform for the same MSI to ensure that cabinet files will not be overwritten.

64) What Is a DLL?

DLL is an acronym for dynamic link library. A DLL is a library, or collection of files,
that contains executable functions or data needed to run the application it is associated
with. DLL files usually end with the .dll, .exe., .drv, or .fon extensions. The application
links to the file as needed, or dynamically, to use the functions or data in the file.

Often DLLs are linked to multiple applications or can be used by various applications on
your computer. These types of DLLs are called shared DLLs or shared components.
Many of the DLLs provided by Microsoft are shared DLLs and can be found in the
Common Files or the Windows System folders.

If during installation a needed DLL file is missing or inaccessible, an error may occur
that prevents the application from being installed. To complete the installation, the
missing DLL file must be provided. Some DLLs are provided by Microsoft with the
Windows operating system. Other DLLs are written for a particular application and are
loaded with the application. If the DLL is one provided with the standard Windows
operating system, it can be restored to your hard disk from the Windows installation disk.
If the DLL was created specifically for that application, the software vendor needs to
provide the missing DLL.

65) What Is Ikernel? Why Do I Need It?

Ikernel is InstallShield's proprietary installation engine. Ikernel exists on your computer


to drive the installation. An installation created with InstallShield first attempts to install
or update (if an older version of ikernel already exists) the ikernel engine files. After
ikernel is successfully installed, the rest of the installation continues installing all of the
application files.

66) What Is an Installation?


An installation, also called a setup, is a program that contains the complete collection of
the files required to install an application on a computer system. The primary task of an
installaion is to transfer the application files from the source medium (for example, a CD)
to your computer. An installation includes all of the application files, as well as setup
engines, that can place the application on the system and configure it to operate on a
particular operating system and with other devices, such as a printer or monitor.
Typically, a setup performs some or all of the following tasks:

• Obtains information from the system


• Obtains information from the user
• Sets up shortcuts and folders
• Updates the Windows registry
• Sets up the application for future modification or uninstallation
• Displays a product information file
• Displays a status bar to show the progress of the file transfer process
• Registers the user
• Terminates the setup and restarts the computer

67) What Is Setup.exe?

Setup.exe is the "package" used to install an application onto your computer. The primary
task of setup.exe is to transfer the application files from the source media, such as a CD,
to your computer. Setup.exe installs installation engines, if necessary, and then
decompresses the application files and installs them into the appropriate folders.
Setup.exe starts the installation and cleans your computer of unnecessary files once the
application is installed.

68) What Is the Windows Installer Engine? Why Do I Need It?

The Windows Installer engine (also called the MSI engine) drives the installation of your
application. It is a part of the Windows Installer Service, a technology developed by
Microsoft to standardize installations on the Windows platform. Without the Windows
Installer engine, installations using the Windows Installer technology cannot be installed.
The Windows Installer engine is already installed on Windows XP. For other operating
systems, the Windows Installer engine must be installed by the installation or by the
home user. Most installations based on the Windows Installer Service automatically
install the Windows Installer engine on the computer prior to running the installation. In
case of an error or other unexpected behavior, you may need to install the engine
manually.

69) What Is a Shared File?

A shared file is a file that can be used by more than one application. The Windows
operating system provides a number of shared files that can be used by any application
installed. Software developers can also create shared files for their own applications.
Shared files allow for the creation of more efficient applications and save time because
the same code does not have to be created for each application. It is created once and
used by many applications.

During installation, files identified as shared are registered in the Windows registry. Each
time the shared file is installed, the registry increments the registry value associated with
it. This registry value is also known as the ref count or the shared reference count. So if
two applications install the same shared file, the registry value (ref count) is 2. During
uninstallation, a shared file's registry value is decremented. When the registry value
reaches 0, you will receive a message asking if you want to remove the shared file, which
means there is no application using the shared file. In almost all cases, you can click Yes
and remove the shared file. The shared file is permanently deleted, and the hard disk
space freed. If you choose No, it will not harm your computer. If you are unsure whether
or not to remove the shared file, click No.

Registry

The registry is a central database used by the Windows operating system to track your
personal settings and the software and hardware installed on your computer. When you
install an application, installation choices are written to the registry. The registry contains
5 major branches:

• HKEY_CLASSES_ROOT – contains information on file-related behavior


including what files are associated with what applications
• HKEY_CURRENT_USER – contains the preferences of the current user
• HKEY_USERS – contains the preferences of each user on the system
• HKEY_LOCAL_MACHINE – contains operating system, hardware, and
application settings
• HKEY_CURRENT_CONFIG – contains hardware settings users can modify for
different circumstances

Important: Modifications to the Windows registry, if not done correctly, can cause
serious problems to a Windows system. Before editing the registry.

self-registering file

A self-registering file is a file that can enter information about itself in the Windows
registry and remove that information upon uninstallation. Other types of files can be used
without entering information into the registry.

The installation of a self-registering file consists of installing the file to its desired
location and then registering the file on your computer. Sometimes. because of system
specific issues, self-registeration may fail, causing an error message to appear, for
example, "Unable to register the file xyz.dll". When an installation is unable to register a
file, you may need to register it manually to make sure that the application works.

70) How do I manually register a file on my computer?


Procedure

Files that are created as self-registering have information that need to be stored in the
Windows registry in order for the file to be available and useable to applications on the
machine. Usually DLLs, OCXs, and EXEs are self-registering and require to be
registered on the machine.

Follow these steps to register DLLs or OCXs:

1. On the Taskbar, select Start > Run.


2. In the Open field, type regsvr32 "<path>\NameOfFile.extension", where
<path> is the directory where the file is located on your computer and
NameOfFile.extension is the name of the file. For example:

regsvr32 "C:\Windows\System32\Mydll.dll"

3. Press Enter.
4. If the file registers successfully, the following message appears on the screen:

Follow these steps to register an executable, or .exe, file:

1. On the Taskbar, select Start > Run.


2. In the Open field, type "<path>\NameOfFile.exe" /REGSERVER, where
<path> is the directory where the file is located on your computer and
NameOfFile.exe is the name of the file. For example:

"C:\Program Files\MyAppLocation\MyApp.exe" /REGSERVER

3. Press Enter.

Most executables do not display any message boxes when registered. It depends on how
the application is created. Some applications when registered may open on your
computer.

Windows System folder

The Windows System folder contains core operating system files. The files contained in
the System folder are necessary to keep your computer running properly. Errors
occurring during installation may be a result of missing or corrupt files contained in the
System folder.

Windows API

A Windows API, or Windows application programming interface, provides building


blocks used by applications written for the Windows platform. Each API is a specific
method prescribed by a computer operating system or by an application program. A
programmer writing an application can make requests of the operating system or another
application with the use of a Windows API. Each API has different system requirements
to run properly. Some installation errors might occur as a result of a failing Windows
API.

user profile

A user profile is a record of an individual user's settings, such as shortcuts, favorites, and
application, display, and hardware settings. User profiles allow multiple users to share a
single computer but maintain their own preferences.

Temp directory

The Temp directory is a folder on your hard disk where the operating system or
applications can temporarily store files while they are in use. When the application exits,
the temporary files are deleted. It may be necessary to manually clean, or delete files
from, the Temp directory.

run-time error

A run-time error is an error that occurs when a program is executed, or run. In the case of
an installation, it is from the time an installation starts through the completion of the
installation. Errors occur during installation for many different reasons, including your
home computer settings, the way the software vendor made the installation, conflicts with
other software, missing files, bugs in the software, etc. Because there are so many
possible causes, it is often hard to determine the exact cause of a run-time error.

path

The path is the route to a file on a computer. In the Windows operating system, the path
is the drive plus the location in the folder system. For example, C:\Program
Files\Microsoft Office\Office\WINWORD.exe, is the path for Microsoft Word.

isscript.msi

Isscript.msi is the InstallScript engine installer. Isscript.msi installs the required files to
run an installation. The InstallScript engine is also known as the InstallShield Scripting
Runtime. InstallScript is the programming language used to create installations. Some
error messages may reference the InstallShield Scripting Runtime or Isscript.msi.

IDriver.exe

Idriver.exe is the InstallShield Scripting Runtime engine. It is required on a computer to


run some installations created with InstallShield. Idriver.exe is located in one or both of
the following common file locations:

C:\Program Files\Common Files\InstallShield\Driver\7\Intel 32


C:\Program Files\Common Files\InstallShield\Driver\8\Intel 32

Some installation error messages may reference idriver.exe.

Environment variable

An environment variable represents some aspect of your computer environment, that is,
the configuration of hardware and software on your computer. Environment variables can
be used to represent drives, program paths, directory names, and other items associated
with your computer environment as well as information such as the date, time, and your
default printer and text editor. Installation programs use environment variables to provide
information to the installation and to store information for later use by the application you
are installing.

Dynamic link library (DLL)

A shared code-base file containing functions that can be called from other applications.

DCOM

The Distributed Component Object Model (DCOM) is an extension of the Component


Object Model (COM), a Microsoft-developed software architecture that allows for the
creation of component-based applications. Component-based applications allow other
components and other applications to use their features. For example, COM allows you to
embed a Microsoft Excel chart into a Microsoft Word document. DCOM extends COM
functionality by allowing applications to communicate over a network or the Internet.

COM

The Component Object Model (COM) is a Microsoft-developed software architecture


that allows for the creation of component-based applications. Component-based
applications allow other components and other applications to use their features, adding
functionality to these programs. For example, COM allows you to embed a Microsoft
Excel chart into a Microsoft Word document.

cache
A cache, pronounced cash, is a temporary storage area for frequently accessed data. The
purpose of caching is to store frequently used information in a location that is easy to
access, resulting in a faster running computer.

There are two types of cache: memory cache and disk cache. Memory cache stores the
data and the address of where the data is stored in main memory. Memory caching is
useful because most applications access the same data repeatedly. Disk caching uses the
main memory. It is used to hold information that has recently been requested from the
hard disk or has previously been written to the hard disk. In general, installations usually
use the disk cache. When data is read from or written to main memory, a copy is also
saved in the memory cache. When data is called for, the computer first checks the
memory cache, then the disk cache, and finally main memory.

cabinet file

A cabinet, or CAB, file is single file that holds a number of compressed files. During
installation of an application, the compressed files are decompressed and copied to your
computer. Cabinet files are efficient because they save space and time when distributing
software. A cabinet file usually has the file extension .cab. Missing or corrupt files may
prevent installations from completing. It may be necessary to replace missing or corrupt
operating system files or InstallShield files by extracting them from a cabinet file.

administrative privileges

Administrative privileges are the highest level of permission that can be granted to a
computer user. Levels of permissions are necessary in networked environments to ensure
system security and prevent damage to computer hardware and software. A user with
administrative privileges can perform tasks such as install and uninstall software and
change a computer's configurations. Administrative privileges usually pertain to
Windows NT 4.0, 2000, or XP machines as opposed to Windows 95, 98, or ME
machines.

In most cases, home users are automatically the administrators of their home computers.
If a home computer user is not the administrator some installations may fail

.NET Framework

The .NET infrastructure was created by Microsoft to allow users to connect and share
data more efficiently using a variety of devices, such as a personal computer, cell phone,
or handheld device. The .NET Framework is an environment for building, deploying, and
running .NET applications. Some applications may be .NET applications and require
the .NET framework to be installed to run.
Q1. What is Windows Installer?

A. Windows Installer is a system service for installing and managing applications. It


provides a standard

method for developing, customizing, installing, and updating applications.

Q2. What basic functionality is provided by Windows Installer?

A. Windows Installer provides the following basic functions:

n Transactional operations. All installation operations are transactional. For each


operation that Windows

Installer performs, it generates an equivalent undo operation that would undo the change
made to the

system. If a failure occurs during the middle of an installation, Windows Installer can roll
back the

machine to its original state.

n Self-healing. Windows Installer supports "self-healing" abilities for applications.


Applications can detect

common installation problems at launch, like missing files or registry keys, and
automatically repair

themselves.

n Installation on demand. Windows Installer supports on-demand installations of


application features.

For example, the spelling checker in Microsoft Office Word may not be installed by
default, but a user can

trigger an on-demand installation of this feature.

n Installation in locked-down environments. In fully locked-down environments, users


don't generally
have permission or the ability to install applications. In most cases, they don't have write-
access to the

Program Files folder of their computers or to the HKEY_LOCAL_MACHINE registry


location. If an

administrator approves an installation package by means of Group Policy, for instance,


Windows Installer

can perform an installation on the user's behalf.

n State management. Windows Installer provides a set of standard Win32® application


programming

interfaces (APIs) and automation interfaces for applications and administrators to use for
querying the

installation state on the machine. The APIs allow querying of the current state,
verification of the existing

state, repair of a corrupted state, and transition from one state to another.

Q1. Windows Installer version 2.0 is the latest released version. What new features
and improvements are provided in version 2.0?

A. Version 2.0 of Windows Installer includes a number of new features and


improvements over previous versions, including the following:

• Installation and management of assemblies. Windows Installer 2.0 is fully integrated


with SxS (Fusion) and Common Language Runtime (CLR) assemblies.

• Increased security. Windows Installer architecture was modified to increase system


security.

• Ability to conceal personal information. Windows Installer provides authors with a way
to hide information, such as passwords, from appearing in log files.

• Multiple user isolation. Modifications to Windows Installer architecture allow for true
isolation of per-user installations since a product's per-user configuration information is
no longer shared among users.

• Digital signature support. Digital signature support is included for Windows Installer-
related files, such as packages (.msi), patches (.msp), and transforms (.mst). Windows
Installer also supports digital signature verification of external cabinet files (.cab)
associated with an installation.

• More robust patching. Numerous patching issues were fixed in version 2.0.

• Simplified patch authoring. Patch conflict resolution in version 2.0 eliminates some of
the burden of authoring patches. Setup authors targeting version 2.0 no longer need to
keep track of every disk ID and last sequence number used by previous patches.

• Improved patch and update installation. Version 2.0 reduces unnecessary source
resolution attempts. In the majority of cases, the user is no longer required to have access
to the original source location when applying a patch unless specifically required by the
package author. Additionally, more efficient updates result from removal of unnecessary
un-versioned file copies.

• Support for transforms and patches from URL sources. Windows Installer version 2.0
now supports using transforms and patches from a source referenced by a Uniform
Resource Locator (URL).

• Enhancement of operating system features. Integration with System Restore and


Software Restriction Policies (Windows® XP features) and improved Terminal Services
support.

• 64-bit service on 64-bit Windows. Windows Installer is a native 64-bit service for the
installation of 64-bit applications on 64-bit versions of Windows.

• Enhanced logging. Event logging has been greatly improved in order to aid
troubleshooting installation issues. This includes ensuring that different errors have
unique event IDs.

• Configurable merge modules. Improvements to MergeMod.dll permit authoring merge


modules (.msm files) containing attributes configurable by the consumer of the merge
module.

Q2. Where can I obtain more information on Windows Installer?

A. More information on Windows Installer can be found in the Windows Installer


software development kit (SDK).

Further information on Windows Installer is available in the following white papers:

• Windows Installer Service Overview

• Windows Installer: Benefits and Implementation for System Administrators


Q3. What versions of Windows include Windows Installer?

A. Microsoft Windows 2000, Windows Millennium Edition (Windows Me), and


Windows XP include Windows Installer. Windows 2000 includes version 1.1 of
Windows Installer, Windows Me includes version 1.2, and Windows XP includes version
2.0. Windows 2000 SP3 also contains version 2.0 of Windows Installer.

Q4. What operating systems does Windows Installer support?

A. This table details the operating systems that each released version of Windows
Installer supports.

Q5. Where can I obtain the latest Windows Installer redistributable?

A. You can obtain the latest Windows Installer redistributable from the Microsoft
Platform SDK Redistributables site. There are two different versions of the Windows
Installer redistributable: one for Windows 95, Windows 98, and Windows Me; and one
for Windows NT and Windows 2000.

Q6. Where can I obtain merge modules for Microsoft technologies I need to
redistribute in my setup?

A. Microsoft merge modules are provided with Microsoft Visual Studio .NET. Their
default installation location is [ProgramFilesFolder]\Common Files\Merge Modules.
Note that not all Microsoft redistributable components have merge modules available.

How-To Guide

Q7. How do I hide an application from Add/Remove Programs?

A. To hide an application from Add/Remove Programs, set the


ARPSYSTEMCOMPONENT property to 1. This property can be set within the Property
table of the package, on the command line, or by means of a transform. On operating
systems earlier than Windows 2000, setting the ARPNOREMOVE property to 1 will hide
the application from Add/Remove Programs. On the Windows 2000 and Windows XP
operating systems, ARNOREMOVE disables the Remove button of Add/Remove
Programs.

Q8. After repeated edits of my .msi package in Orca, the size of the package has
grown considerably. How can I reduce the size of my .msi file?

A. The .msi package database format is based upon OLE structured storage. Frequent
editing of the database over time can result in fragmentation and wasting of space. You
can reduce the size of the .msi package by using the SaveAs command in Orca or
alternatively by exporting all of your tables with msidb.exe from your package and then
re-importing them into a newly created database.

Both the Orca and msidb.exe tools are available in Windows Installer SDK.

Q9. How can I hide the Cancel button during an installation?

A. Beginning with Windows Installer 2.0, there is a command-line option, that makes it
possible to hide the Cancel button during basic user interface (UI) installations. The
following command-line script demonstrates how to use the new option:

msiexec /i {path to package} /qb!

You can also hide the Cancel button by using the MsiSetInternalUI Win32 API to
combine INSTALLUILEVEL_HIDECANCEL with INSTALLUILEVEL_BASIC.
Alternatively, the same can be accomplished through Windows Installer automation by
combining msiUILevelHideCancel with msiUILevelBasic when using the read-write
UILevel property of the Windows Installer object.

During an installation, the presence of the Cancel button can be changed through a DLL
or script custom action that sends an INSTALLMESSAGE_COMMONDATA message.
DLL custom actions would use the MsiProcessMessage Win32 API to send an
INSTALLMESSAGE_COMMONDATA message where field 1 of the record is set to 2
and field 2 of the record is set to 0. To unhide the Cancel button, the same message would
be sent, but with field 2 set to a value of 1. Script custom actions would use the
equivalent Message method of the Session object.

Q10. How do I install only the features I want?


A. The ADDLOCAL, ADDSOURCE, and ADVERTISE properties can be used to install
only a certain number of known features. The following command-line script would be
used to install the "Sports" and "News" features of the example.msi package locally on
the machine.

msiexec /i example.msi ADDLOCAL=Sports,News /qb

The following command-line script would advertise the "Sports" feature and install the
"News" feature to run from source.

Msiexec /i example.msi ADVERTISE=Sports ADDSOURCE=News /qb

Another important thing to remember is that feature names are case-sensitive.

Q11. How do I force-update an unversioned file during an upgrade, even if the user
has modified it?

A. You can "force-update" an unversioned file during an upgrade by authoring a version


number for that file in the File table. Based on Windows Installer file-versioning rules, a
versioned file will overwrite an unversioned file. The caveat to this approach is that all
subsequent reinstallations will require access to the source, since all subsequent version
checking will indicate the file needs to be reinstalled.

Q12. How do I correctly author path strings?

A. Directory property values end with a directory separator. Authoring a path string
therefore does not require the use of the directory separator.

Incorrect: [DirectoryProperty]\someLocation

Correct: [DirectoryProperty]someLocation

Q13. How do I author products with different locales?

A. For products with different versions, either due to language or other differences
between products, use different product codes. To indicate a direct, familiar relationship
among the products, have the products share the same upgrade code.
Security

Q14. What is a managed application?

A. A managed application is an application where the system administrator exerts some


level of control over the installation and maintenance of the product. Managed
applications are often used to deploy software to large numbers of users or machines.
Managed applications are a way for system administrators to allow users to install
authorized software in locked-down environments where users generally do not have the
rights to install software.

An application is considered managed if it is:

• Installed or advertised to a user by a member of the Administrators group.

• Installed or advertised per-machine by a member of the Administrators group.

• Assigned or published on Windows 2000 and later by an Administrator.

• Marked as managed by another software and deployment management system. The


exact method depends on the management system used, but generally requires an
administrator's action.

An installation package cannot declare itself "managed." Whether or not an application is


managed is controlled by the system administrator.

Note that "managed" is different from "elevated." An elevated application is an


application that can run with system privileges when installing. All managed applications
are elevated, but applications can be elevated without being managed by means of the
AlwaysInstallElevated policy. Due to its security implications, this policy is disabled by
default and requires careful consideration before use.

Q15. What is the difference between the AdminUser and Privileged properties?

A. The AdminUser property is set when the user performing the installation is an
administrator; the Privileged property is set when the user is allowed to install with
elevated privileges. A user can install with elevated privileges if the user is an
administrator, both the per-user and per-machine AlwaysInstallElevated policies are set,
or the application has been assigned by the system administrator.
If the user is an administrator, then both the AdminUser and Privileged properties are set.
If the user is not an administrator, then AdminUser is never set. In that case, Privileged is
only set if the user has been given permission by the administrator through assignment or
policy to install the application as elevated.

In many cases, it is recommended that launch conditions or similar conditions use


Privileged instead of AdminUser to allow for installation of applications assigned by
administrators.

Q16. Should users with user-level privileges be able to install MSI applications?

A. Those with user-level privileges can install managed applications if the system
administrator has enabled the installation. Otherwise, the user will only be able to install
MSI applications provided the user has permission to write files, create directories, and
write registry keys in the locations where the installation typically writes those resources.
If the user cannot write to a location, then the installer will only be able to write to that
location if the administrator has given permission for the installer to do so.

Custom Actions

Q17. What are the differences between a 'deferred' custom action and an
'immediate' custom action?

A. • Deferred custom actions can only be sequenced between the InstallInitialize and
InstallFinalize actions in execute sequence tables. Immediate custom actions, on the other
hand, can be sequencd anywhere within any of the sequence tables.

• Deferred custom actions cannot access the installation database. In fact, deferred custom
actions have very limited access to the installation session because an installation script
can be executed outside of the installation session that created it. Immediate custom
actions have access to the installation database and can read and set installation
properties, modify feature and component states, and add temporary columns, rows, and
tables among other things.

• While both deferred and immediate custom actions can run in the context of the user
initiating the installation, only deferred custom actions can run elevated using the system
context.
• Deferred custom actions are not executed immediately. Instead they are scheduled to
run later during the execution script. The execution script isn't processed until the
InstallExecute, InstallExecuteAgain, or InstallFinalize action is run.

Q18. When should I use a deferred custom action instead of an immediate custom
action?

A. Deferred custom actions should be used when the custom action must make a change
to the system or call another system service. Additionally, only deferred custom actions
can run in an elevated context. If your custom action requires elevated privileges in order
to run, your custom action needs to be marked as deferred.

Note: Custom actions marked to run in the system context


(msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate) will only
run in the system context if the installation itself is elevated.

Additionally, when making a change to the system by means of a custom action, you
should also include a rollback custom action that can undo the change.

Q19. How can I provide data to my deferred custom action?

A. Deferred custom actions have limited access to the installation session. If your
deferred custom action requires information about the installation that it cannot obtain
through its limited access, then you can provide that information to the deferred custom
action through the CustomActionData property. This method is only available to script
and DLL deferred custom actions. This is how it works:

1.An immediate custom action that executes before the deferred custom action sets a
property with the same name as the deferred custom action to the value that is needed by
the deferred custom action. So, if the primary key for a deferred custom action is called
"DeferredCA," then the immediate custom action would set a property called
"DeferredCA" to the value that was needed. A type 51 custom action would be an easy
way to set this property. Another method would be an immediate custom action that calls
MsiSetProperty with the szName parameter equal to "DeferredCA." Note: The action
name is case-sensitive.

2.When the deferred custom action is queued into the installation script, the installer will
write the value of the property "DeferredCA" into the installation script as the value of
the property CustomActionData.

3.Upon execution, the deferred custom action retrieves the value by making a
MsiGetProperty call with the szName parameter equal to "CustomActionData."
Alternatively, a script custom action would use the Property property of the Session
object.

Q20. How can my custom action trigger a reboot?

A. An immediate custom action can trigger a reboot by calling MsiSetMode with a run
mode of MSIRUNMODE_REBOOTATEND or MSIRUNMODE_REBOOT and a state
value of TRUE. Since MsiSetMode requires an hInstall handle, only DLL and script
custom actions can trigger a reboot. Script custom actions would use the Mode property
of the Session object. Alternatively, an immediate custom action can call MsiDoAction
with szAction equal to "ScheduleReboot."

Deferred custom actions cannot call MsiSetMode. A deferred custom action would need
to set a value in a location in the registry that an immediate custom action, sequenced
after InstallFinalize would read. That immediate custom action could then schedule the
reboot using MsiSetMode. If this method is required, a rollback custom action should
also be provided that will delete the registry value that triggers the reboot if the
installation is cancelled.

Q21. How can my custom action add information to the verbose log file?

A. DLL and script custom actions can add information to the verbose log file by sending
INSTALLMESSAGE_INFO messages using the MsiProcessMessage API. Script custom
actions would use the Message method of the Session object.

Q22. Why are multiple MSIExec.exe processes running on my machine during an


installation?

A. A number of MSIExec processes can be running during an installation. The reason for
this is that Windows Installer uses a client-server model for performing installations.
Additionally for security reasons, Windows Installer hosts DLL and script custom actions
in a "sandbox" process. Depending on how the install was initiated, one of the MSIExec
processes can be the client process. Another MSIExec process is Windows Installer
service. Any remaining MSIExec processes are usually sandbox processes for hosting
custom actions. The determination as to which MSIExec process will serve as the
sandbox process for a script or DLL custom action depends in part on whether the custom
action will run elevated or impersonated and whether the custom action is 32-bit or 64-
bit.
Patching and Upgrades

Q23. What are the differences between small, minor, and major updates?

A. A small update is a product update that changes a few files or possibly adds some new
content. A minor update is a product update that makes enough changes to warrant
changing the product version for the product, whereas a major update is a product update
with a large number of changes that warrants a change in the product code. This table
summarizes what changes in each update and the possible distribution vehicles for each.

It's sometimes easier to think of a small update as a "hotfix" or Quick Fix Engineering
(QFE) update, a minor update as a service pack, and a major update as a product
upgrade.

Small and minor updates can be considered almost equal in that the only real difference is
that a minor update has a change to the ProductVersion whereas a small update does not.
The rules that they follow and application of the patch are the same. Application of small
and minor update patches requires explicit reinstallations. Major updates are not subject
to that limitation and a reinstallation is not required for patch application. Additionally
small and minor update patches are limited in the changes that can be made to the
feature-component structure for the package. Significant changes can be made to the
feature-component structure in the scope of a major update.

Q24. When will patches require the original source?

A. Windows Installer 2.0 has a number of improvements in the area of patching to


minimize original source requirements. However, there are still some circumstances in
which the original source may be required:

• The patch applies to a feature that is currently run from source. In this case, the feature
is transitioned from the run-from-source state to the local state.

• The patch applies to a component that is broken (missing/corrupted file).

• The patch applies to a file in a component that also contains unversioned files with no
MsiFileHash entries. A populated MsiFileHash table is required to prevent unnecessary
recopying of unversioned files from the source location.

• The patch was applied with a REINSTALLMODE of amus. The a option is dangerous
in that it will perform file copies regardless of file version. This can lead to revision of
earlier files and will almost always require the source. The recommendd
REINSTALLMODE value is omus.
• The cached package for the product is missing. The cached package is needed for
application of the patch. The cached package is stored in the %windir%\Installer folder.

• The package is authored to make a call to the ResolveSource action. This action should
generally either be avoided or conditionalized appropriately because its execution will
always result in an access of the source.

• The package has a custom action that attempts to access the source in some manner.

• The patch package consists of binary patches that won't apply to the current version of
the file on the machine. Consider the following example:

• Install RTM version of product Example. This puts version 1.0 of Example.dll on the
machine.

• Apply patch qfe1.msp to the machine. This patch patches version 1.0 of Example.dll to
version 1.1.

• A new patch, qfe2.msp is provided which updates Example.dll to version 1.2. However,
the patch was only created to target version 1.0 of Example.dll because it was generated
using the RTM version of the product. Example.dll version 1.2 includes the fix that is in
Example.dll version 1.1, but the MSP was generated between the RTM and QFE2
images. So, when qfe2.msp is applied to the machine, Windows Installer will need to
access the original source. The binary patch for example.dll cannot apply to version 1.1;
it can only apply to version 1.0. This results in the installer re-copying version 1.0 of
example.dll from the original source location so that the patch can be applied
successfully.

Q25. How can I prevent my patch from requiring the source?

A. At this point, you can't completely prevent a patch from requiring the source.
However, the following steps could help eliminate a number of those instances:

• Use whole-file only patches. This saves the patch creator from having to create binary
patches for every previously released patch plus the RTM version. You can easily set a
patch to be a whole-file only patch by authoring the IncludeWholeFilesOnly property
with a value of 1 in the Properties table of the Patch Creation Properties file (PCP).

• Ensure that none of your custom actions access the original source location.

• Ensure that the ResolveSource action is conditionalized appropriately in your package,


or not present at all.
• Populate the MsiFileHash table for all unversioned files in the package. Windows
Installer SDK includes a utility, MSIFiler.exe, and a script, Wifilver.vbs, that can do this
automatically.

Q26. Why was my patch successfully applied but no files were updated?

A. Most likely you simply double-clicked a small or minor update patch. Application of a
small or minor update patch requires an explicit reinstallation to be performed for the
files to be updated. This can be accomplished using the MSIExec command line and
including the REINSTALL and REINSTALLMODE properties (that is: msiexec /p {path
to my patch.msp} REINSTALL=ALL REINSTALLMODE=omus). Another option
would be to include a custom action in the patch that will set the REINSTALL and
REINSTALLMODE properties appropriately. You should make sure that you
conditionalize this custom action appropriately so that it only runs on first application of
the patch. Subsequent reinstalls of the product should not result in execution of the
custom action, otherwise your product may no longer be uninstallable. Other options
include using a bootstrap executable that calls MsiApplyPatch with the appropriate
property settings or using Windows Installer automation object to script the patch
application.

Q27. Can I update a custom action via a patch?

A. Yes, you can update a custom action using a patch. If the custom action is included in
the Binary table, then simply update the custom action in the update installation image.
When you generate the patch between the original and update installation images, the
patch will contain a database transform that will transform the old binary data stream to
the new binary data stream.

Troubleshooting

Q28. How can I figure out why my package fails to install?

A. There are three good troubleshooting methods for tracking down package installation
problems. The first method is to ensure that your package is valid by running validation.
Validation helps catch common installation authoring problems by identifying errors and
warnings. Two tools can be used for validating an installation package, both are available
in the Windows Installer SDK: MsiVal2 and Orca. MsiVal2 is a command line utility for
validating a package. Orca provides a graphical user interface for validation and will also
highlight invalid entries in the package.

The second method is to use the application event log. Windows Installer will record
successful and failed installation information in the application event log.

The final method is to generate a verbose log file, and then analyze the verbose log file
looking for the source of the error. A helpful utility for analyzing verbose log files is the
WILogUtl.exe tool provided in the Windows Installer SDK. Logging can be enabled via
Windows Installer logging policy or by appending "/L*v path to logfile" to your
MSIExec command line.

To generate a detailed verbose log file through policy, use the following registry key:

• HKLM\Software\Policies\Microsoft\Windows\Installer

• Set: Logging = REG_SZ voicewarmup

• Set: Debug = REG_DWORD 0x7

Log files generated through the policy key will be of the form msiXXXXX.log in the
user's %temp% folder.

Note: Logging through the command line overrides any logging policy settings.

Q29. Every time I launch my application, Windows Installer performs an


installation. How can I determine the cause of the on-demand installation?

A. An easy way to determine the cause of an on-demand installation is to look in the


application event log for MsiInstaller log messages of the form:

Event Type: Warning

Event Source: MsiInstaller

Event ID: 1001

Description:

Detection of product '{000C1109-0000-0000-C000-000000000046}', feature 'Example'


failed during request for component '{00030829-0000-0000-C000-000000000046}'
Event Type: Warning

Event Source: MsiInstaller

Event ID: 1004

Description:

Detection of product '{000C1109-0000-0000-C000-000000000046}', feature 'Example',


component '{00030829-0000-0000-C000-000000000046}' failed. The resource
'C:\Progam Files\example\example.exe' does not exist.

The first message (with event ID 1001) states which component was being installed. The
component listed here is the component named in the Component_ column of the
Shortcut table for the particular shortcut.

The second message (with event ID 1004) indicates which component failed detection.
Improved event logging in Windows Installer 2.0 has updated the message so that in most
cases, the message identifies the actual resource that resulted in the failed detection. The
component with the missing or damaged keypath is the component that is triggering the
reinstallation.

In the example above, the reinstallation is triggered because the resource 'c:\Program
Files\example\example.exe' does not exist. You would then need to find out why the
keypath does not exist—in this case, the user deleted it.

Q29. How can I determine whether Windows Installer installed my feature or


component?

A. Determining whether Windows Installer installed a particular feature or component is


fairly easy. The answers can be found in a Windows Installer verbose log file. The first
thing to look for is the logging of the InstallValidate action. This action will log the
installed, request, and action states of each feature and component in the installation
package.

MSI (s) (5C:F4): Doing action: InstallValidate

Action start 1:51:18: InstallValidate.

MSI (s) (5C:F4): Feature: Example; Installed: Absent; Request: Local; Action: Local

MSI (s) (5C:F4): Component: Example; Installed: Absent; Request: Local; Action: Local

Action ended 1:51:18: InstallValidate. Return value 1.


In the log file snippet shown above, the "Example" feature will be installed locally since
its action state is local. Furthermore, the component "Example" will also be installed
locally given its action state.

Q30. Why are my files not being removed during uninstallation?

A. There are four common reasons for why files may not be removed during
uninstallation:

• The components to which these files belong are marked as permanent. (This is done
through the Attributes column of the Component table.)

• None of the components to which these files belong have component GUIDs. (The
value for the component in the ComponentId column of the Component table is NULL).
Components without GUIDs are not managed by Windows Installer.

• If the keypath of the component has a shared DLL refcount, then the component will
not be uninstalled.

• If the component is installed in the system folder and at the time of uninstallation there
is an external shared DLL refcount for any one file in the component, then the component
will not be uninstalled.

Q31. Why are my folders not being removed during uninstallation?

A. Folders are not removed during uninstallation because of one of the following
reasons:

• The RemoveFolders action is missing from the execute sequence table when both the
CreateFolder table and CreateFolders action are used.

• The folders were not created by Windows Installer, therefore it will not remove them
unless told to do so.

• Resources still exist in the folder.

Q32. Why are my registry keys not being removed during uninstallation?

A. The most common causes for leaving behind registry keys during uninstallation are:
1.The Registry table contains entries marked with the '+' sign. This directs the installer to
leave behind those registry keys during uninstallation.

2.In the InstallExecuteSequence table, the RemoveRegistryValues action is sequenced


after the UnregisterProgIdInfo and UnregisterMIMEInfo actions. The sequence of these
actions needs to be reversed. The presence of some registry values written from the
Registry table prevents certain ProgId, extension, and CLSID keys from being removed.

Q33. Why is the disk space consumed by the installation so much larger than the
actual sizes of the files I am installing?

A. Windows Installer calculates two types of space consumption: the space consumed
with rollback, and the space consumed without rollback. The space consumed without
rollback is the actual disk space consumed by the installation. The space consumed with
rollback will include the space of the backup files necessary for supporting rollback
during the installation. Additionally, Windows Installer calculates some of the overhead
required for performing the installation. Included in the overhead is the space required for
the installation script and the space requirements of the cached package. Furthermore, the
installer runs from a temporary copy of the installation package during the installation.
Both the space requirements of the installation script and the space requirements of the
running copy of the package are temporary. These files are cleaned up after installation.
Consider the following example where your installation package is around 80 kilobytes
(KB) in size and you are installing a 4 KB file (Note: your numbers may vary depending
on the cluster size of your hard drive):

89120 bytes (cached MSI, rounded to nearest cluster size of 4 KB)

89120 bytes (temporary working copy of MSI)8192 bytes (estimated script size)

4096 bytes (small file, rounded to disk cluster size of 4 KB)

----------------------

176128 bytes = 172 KB

Q34. Why is Windows Installer prompting for a reboot?

A. Windows Installer may prompt for a reboot if it installs over a file that is in use or the
package explicitly requests that the installer reboot. It is easy to determine if Windows
Installer prompts for a reboot because it installed over a file that is in use. The first step is
to generate a verbose log file. In the verbose log file, look for the presence of the
ReplacedInUseFiles property in the property dump. If this property is present with a
value of 1, then the Installer will require a reboot because it overwrote an in-use file.

To determine which file was in-use, scan the log file for "Info 1603" and "Info 1903"
messages. The 1603 message will be logged by the InstallValidate action. For example:

MSI (s) (DC:DC): Doing action: InstallValidate

Action start 19:55:42: InstallValidate.

Info 1603. The file d:\test\sample.exe is being held in use by the following process:
Name: sample.exe, Id: 4068, Window Title: 'Sample'. Close that application and retry.

Normally, this messag;e coincides with the presentation of the FilesInUse dialog box. In
silent UI cases, this dialog box will not be presented. Additionally, not all files that are in
use will show up in the FilesInUse dialog box. The FilesInUse dialog box may not be
displayed if the files in use are not executables, the process holding the files is the
process invoking the installation, or the process holding those files is one that does not
have a window title associated with it.

The FileCopy opcode in the install script can also log the 1603 info message. In the
above example, the log file contains:

MSI (s) (DC:DC): Executing op: FileCopy(SourceName=sample.exe,


SourceCabKey=sample.exe, DestName=sample.exe, Attributes=0, FileSize=2044928,
PerTick=32768, , VerifyMedia=1, , , , , CheckCRC=0, Version=2.0.2600.0, Language=0,
InstallMode=59244544, , , , , , )

Info 1603. The file D:\test\sample.exe is being held in use. Close that application and
retry.

At the end of the script during cleanup, the following log file message identifies the
culprit for the reboot:

Info 1903. Scheduling reboot operation: Deleting file D:\Config.Msi\12544a31.rbf. Must


reboot to complete operation.

While the file is named 12544a31.rbf, it is the Sample.exe file. In order to install the file,
the in-use file was renamed to the .rbf file and will be deleted upon reboot.

Q35. What does the ERROR_INSTALL_PACKAGE_VERSION error (1613)


mean?
A. The error ERROR_INSTALL_PACKAGE_VERSION means that the version of
Windows Installer on the machine does not support the schema of the package. The
package schema is indicated by the PID_PAGECOUNT property in the summary
information stream of the package. If the schema number of the package is greater than
the maximum supported schema by Windows Installer, you will need to update your
version of Windows Installer or re-author the package to be compatible with an earlier
schema.

The minimum supported schema for all versions of MSI is 30.

The maximum supported schema for each version of MSI is:

• Windows Installer 1.0: 100

• Windows Installer 1.1: 110

• Windows Installer 1.2: 120

• Windows Installer 2.0: 200

Q36. When launching an installation from a system account, I receive error 2103.
Why?

A. Launching an installation from a system account, like the scheduler service, may result
in the 2103 error. This can occur if you are initiating a per-user installation. Only per-
machine installations are permitted from the system account because the system account
does not have all of the necessary per-user profile folders.

Q37. Why do I receive error 2755 when launching an installation from a mapped
drive letter on a terminal server?

A. Windows 2000 and earlier operating systems do not support passing mapped drive
letter information between terminal server sessions. Since Windows Installer service runs
as a service in the console session, mapped drive letters established in remote sessions are
not visible to Windows Installer service, resulting in this error. This only applies when
running the service in Application Server mode, not Remote Admin mode.

Note that this limitation no longer exists in Windows XP and later operating systems.
Q38. Why do I receive a security warning dialog box with the message 'An error
occurred while accessing online revocation server' when installing a package using
the Web download bootstrap?

A. The security warning dialog is presented because of a problem in the way the Web
download bootstrap (Setup.exe) performs the digital signature verification. This problem
has been fixed in the latest available sample code provided with the Windows Installer
SDK available in the Microsoft Download Center. Simply re-build the Setup.exe using
the PSDK build environment and the provided sample code. Then re-configure the
Setup.exe using the MSIStuff.exe utility. You can download the fixed sample code from
the SDK Update site.

Question 41

Can a non-admin user run an msi?

Answer

If you only install to locations where non-admins users have privileges, then the answer
is easy: yes.

If you install to locations such as program files or HKLM, then the answer is -- they can
with MSI if the package has been blessed by an admin to run elevated. Otherwise
attempts by the non-admin to write to program files are going to fail. And additionally, a
package can't self-elevate -- that would be a security issue.

For the latter case, consult the documentation on MSDN: Installing a Package with
Elevated Privileges for a Non-Admin. This is basically what Group Policy and SMS are
for.

Question 42

What will happen if the per-user install is followed by an install running with
administrator privileges (i.e. one triggered by the IT administrator)?

Answer

Say the admin installs the same app per machine. After this setup is done, User1 still sees
the per-user installed app in ARP, and User1 cannot use the full functionalities in the per-
machine installed app. But other users could use the per-machine installed app. So when
MSI does a per-machine install, it does not uninstall the same app installed per-user for
some particular user context.
If you’d like ensure the full functionalities of your app are available to all users, and
some of them require admin privilege to install, please condition your setup to run for
admin (see LaunchCondition Table and Privledged Property)

Question 43

Does Windows Installer remember at uninstall the value of a property set during install?

Answer

No, Windows Installer doesn’t cache properties.

Question 44

How can I retain the value of a Property between install and uninstall?

Background

The best option is to not require persistence. For example, if you are substituting into file
or registry paths, that likely means you are violating component rules. One strategy is to
attach actions to components and let the component uninstall trigger the reverse action.

The component rules stipulate that component definitions (file sets & registry) should be
consistent across all definitions of that component (products, versions) and be exclusive
of other components so that the installer’s reference counting of components and use of a
product-specific definition ensures that the component gets added and removed properly.
These rules aren’t as interesting unless (1) you have multiple products or versions that
may coexist and (2) you care about getting a clean uninstall. Those may not apply in your
case. If that component is always installing the same UDL file to the same location, then
the oddity would come if there were a way to install it again with different substitutions.

Here are the options that occur to me:

1. Write the values to the registry and use RegLocators to scan them back.
2. Write a custom action to read the property values from a custom storage file.
3. Install the pre-processed file to one location and substitute to the final location.
Do this on install only, and add a RemoveFile to remove that file on uninstall.
That would prevent any repairs from replacing the original file.

For 1, the preferable way to do this is by dynamically adding the values to a component,
however the Component Rules must be honored for compositional integrity of that
component.

Answer
Most of the Windows Installer adopters inside and outside of Microsoft use the registry
method when they need to persist property value(s) since we don’t have an out of box
solution for them yet.

Future

(Note: just a comment, not acommittment) It would be a nice feature addition to


Windows Installer to add a “Persist” flag on public properties -- if set the Property value
would be updated in the Property table for the cached MSI. Then on re-install it would
automatically pick up the value from the initial install. Or maybe follow the paradigm of
“AdminProperties” where you list what properties you would like to persist.

Windows Installer 3.1 Version Confusion

A common question I have been receiving lately is about the Windows Installer 3.1 (v2)
Redistributable and what version of the Windows Installer is actually the "latest". Well,
let's hope that this posting clears up any confusion on the topic. :)

There are actually three versions of Windows Installer 3.1 that have been released:

3.1.4000.1823 This version is installed with the original Windows Installer 3.1 (v1)
redistributable.

3.1.4000.1830 This version is the version that shipped with Windows Server 2003
Service Pack 1.

3.1.4000.2435 This is the latest version and contains a fix to address the issue in
KB898628.

It's important to note that 3.1.4000.1823 and 3.1.4000.1830 are functionally identical.
The reason why the version numbers are different is because the final build of Windows
Server 2003 Service Pack 1 was made a few days later than the final build of our original
redistributable package.

Now that you know all the version information, let's discuss how you can ensure that you
have the latest version:
Both the original version of Windows Installer 3.1 (3.1.4000.1823) as well as the updated
version (3.1.4000.2435) were sent out through Windows Update as critical updates. If
you use Windows Update to automatically update your machine, you should already have
the latest version.

If you want to check the version of the Windows Installer on your system, check the
version of MSI.DLL in the Windows\System 32 folder. If the version is 3.1.4000.2435,
you have the latest version.

One common point of confusion is that even if you have the latest version of Windows
Installer 3.1 on your system and you type in msiexec.exe /? from a command-window,
you will still be told that you are on version 3.1.4000.1823 or 3.1.4000.1830. This is
because msiexec.exe /? will only give you the version of msiexec on the system -- not the
other Windows Installer-related dll's. (The version of msiexec was not updated to
3.1.4000.2435 with the (v2) redistributable, just msi.dll was updated.)

If you find that the version of MSI.DLL on your system is not 3.1.4000.2435, the easiest
way to get to the newest version is to go to Windows Update and download the update. If
you need to manually download the update, you can visit KB898715 for Windows Server
2003 SP1 and 64-bit Windows XP systems or KB893803 for other supported platforms.

Question 45

What considerations are there for obfuscating my .MSI file with say a .DAT file name?

Background

I've seen this choice pursued when folks have a bootstrapper, usually setup.exe, that they
always want to call the .MSI file. The justification here is that a Right-Click -> Install
operation on the MSI file itself will not work from some technical reason in the package.

Design Consideration

Yes, other folks have used the hiding ‘msi with different file extension’ approach. Over
the lifespan of software, the information I’ve received back on this approach is that
modifying the file extension just complicates the support and admin scenarios without the
targeted benefit of preventing motivated folks from messing with the package. If the bar
is ‘keeping honest people honest’ then a LaunchCondition with a good error message is
usually enough.
Question 46

How do I launch a browser after my install completes?

Solution

Please have a look at the MSDN topic: Using a Custom Action to Launch an Installed
File at the End of the Installation

Key Custom Action Snippit from Tutorial.cpp from Windows Installer Section of
Platform SDK

//////////////////////////////////////////////////////////////////////////////

// LaunchTutorial

//

// Launches a installed file at the end of setup

//

UINT __stdcall LaunchTutorial(MSIHANDLE hInstall)

BOOL fSuccess = FALSE;

// szTutorialFileKey is the primary key of the file in the

// File table that identifies the file we wish to launch

const TCHAR szTutorialFileKey[] = TEXT("[#Tutorial]");

PMSIHANDLE hRecTutorial = MsiCreateRecord(1);

if ( !hRecTutorial

|| ERROR_SUCCESS != MsiRecordSetString(hRecTutorial, 0,
szTutorialFileKey))

return ERROR_INSTALL_FAILURE;

// determine buffer size

DWORD cchPath = 0;
if (ERROR_MORE_DATA == MsiFormatRecord(hInstall, hRecTutorial, TEXT(""),
&cchPath))

Question 47

Where can I get some help parsing the Windows Installer logs?

Answer

Check out Wilogutl.exe

Question 48

How do I detect that the installer is doing a repair?

Answer

You can check if the REINSTALL property is set. If you want to detect if a patch
operation is happening (which also sets the REINSTALL property), you can check if the
PATCH property is set (or the MsiPatchRemovalList property for patch uninstall).

Question 49

Is there a way to surgically update the MSI with the signed binaries without having to
repackage the MSI?

Answer

You can use MsiFiler.exe tool to update File table and MsiFileHash table.

If you are looking for fully verified signed installation, then check out Authoring a Fully
Verified Signed Installation and Msicert.exe

Question 50

Can I enable a particular priviledge for my NoImpersonate custom action?

Answer

No.

DCOM will strip privileges from the token that are not explicitly enabled. That's a
DCOM design -- not MSI and since custom actions are 3rd party code, they are not
hosted in-proc but rather in a sandbox process. You'll find that MSI actually worked
around this design limitation of DCOM in MSI 3.0 itself.

If that privilege is not already enabled within the token, then it will not be available due
to the DCOM behavior.

Problem 51

I’m trying to build a customized cub file to run against my MSI using msival2.exe. I built
a DLL with some customized ICE errors and inserted it into the cub file. When I run
msival2, it keeps complaining the DLL cannot be run. The detail error is following.

Product: -- Error 1723. There is a problem with this Windows Installer package. A DLL
required for this install to complete could not be run. Contact your support personnel or
package vendor. Action MyCustomICE, entry: MyCustomICE, library:
C:\DOCUME~1\<emailname>\LOCALS~1\Temp\MSI121.tmp

Solution

The most likely problem is the custom action entry points are not properly exported from
the DLL. Did you use a .def file or linker /export switch to prevent the exported function
names from being decorated?

Problem 52

How can I tie the execution of an MSI with an enclosing Wrapper?

Design Considerations

Pragmatically

Product Support and Administrators need the capacity to operate MSIs from the
command line so there’s never been a need for MSI users to exclusively tie an MSI to a
wrapper. One should observe that any manipulation done in the package can be altered by
a savvy person and removed.

Solution

Typically this is solved with a simple LaunchCondition. Here's how one can add this
using the tools in the Windows Installer SDK. Third-party package tools may have other
solutions so check with your package vendor (of course, that is if you are using one ;^).
Note: this is intended to allow the installation if launched from the wrapper, or if it has
already been installed - thus allowing maintenance (modify, repair, update, uninstall)
operations without having to use the wrapper.

Task 1: Open the Windows Installer File by Using the Orca Editor
To open the MyApp.msi file and to add a launch condition by using Orca, follow these
steps:

1. Start Orca.

Note To download and to install Platform SDK (including Orca), visit the
following Microsoft Web site:

http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
(http://www.microsoft.com/msdownload/platformsdk/sdkupdate/)

After you install Platform SDK, install Orca. To do this, double-click the
Orca.msi file that is located in the Bin subfolder of the Platform SDK
installation folder.
2. On the File menu, click Open.
3. In the Open dialog box, locate the MyApp.msi file, and then click Open.

Note This file is located in the MyApp\Debug folder.

Task 2: Add New Tables to the Windows Installer File

To add new tables such as the LaunchCondition table to the MyApp.msi file, follow these
steps:

1. Under Tables in the left pane, the LaunchCondition table exists. If this tables does not
exist, perform step 2 and step 3.
2. On the Tables menu, click Add Table.
3. In the Add Tables dialog box, click to select the check boxes for LaunchCondition,
and then click OK.

Task 3: Set Launch Conditions in the Windows Installer File

You can establish the launch condition based on a property. To set the launch condition
in your MyApp.msi file, follow these steps:

1. Under Tables in the left pane, click LaunchCondition, and then click Add Row on the
Tables menu.
2. In the Add Row dialog box, click Condition in the Name column, and then
type WRAPPERCALLEDME OR Installed in the Condition - String[255], Required
text box.
3. In the Name column, click Description, and then type Please launch [ProductName]
through the wrapper. in the Description - Localizable String[255], Required text
box.
4. In the Add Row dialog box, click OK.
5. On the File menu, click Save, and then close Orca.
Task 4: Verify That Your LaunchCondition Works

To test your application, follow these steps:

1. Locate the MyApp.msi file on your computer.


2. Right-click MyApp.msi, and then click Install. You should receive the message and
the installation should error out:

Please launch [ProductName] through the wrapper.


3. Open a command shell and run msiexec /i MyApp.msi WRAPPERCALLEDME=1,
and the install should complete as if the LaunchCondition were not present
4. Open a command shell and run msiexec /x MyApp.msi, and the uninstall should
complete as if the LaunchCondition were not present.

Now all you have left to do is add the WRAPPERCALLEDME=1 command line value
the invocation of MyApp.msi from your wrapper.

Question 53

What are some sources of: Error 1606: Could Not Access Network Location?

Answer

Generally, the installer will validate the existence of directories listed in the directory
table -- if you don't install to that directory, then don't list it in the table.

On rare occasions, this can be sourced to the issue described in You receive an "Error
1606" error message when you try to install or remove a Microsoft program

Question 54

I went to the Microsoft download site and could not find a entry for the Windows
Installer SDK. Where is the Windows Installer SDK?

Answer

The Windows Installer documentation on MSDN always lists the download page for the
Installer SDK. It's the same location as the platform SDK. Our parent MSDN
documentation page that provides links is: Other Sources of Windows Installer
Information

Another way of locating the SDK is to look in the MSDN topics for the individual tools.
For example, you'll find that the Orca.exe MSDN topic provides you with the link to the
download location. Note: by traversing through Windows Installer documentation, it will
always be direct to the latest Platform SDK site. As of now (Windows Installer 3.1
release), the latest for Windows Installer for the Server SP1 SDK.

Question 55

Updated build of MSI not being installed despite REINSTALLMODE=vomus property?

Troubleshooting

Start by noticing that features that should be installed are actually listed as Advertised

MSI (s) <process info>: Feature: AdminTools; Installed: Advertise; Request: Reinstall;
Action: Reinstall

This is the root cause of why the files weren't updated -- the features showed up as
advertised.

The next question to ask yourself is why are the features showing up as advertised?

MSI (s) <process info>: SELMGR: ComponentId '{470D6551-91D3-478E-AA51-


49B6CF1772FE}' is

Question 56

Why does the Windows Installer log list apparently duplicate components prepended
with double underscore and appended with 65? Example:

Action start <time>: InstallValidate.

MSI (s) <process info>: Feature: Simple; Installed: Absent; Request: Local; Action:
Local

MSI (s) <process info>: Component:


Simple7890123456789012345678901234567890123456789012345; Installed: Absent;
Request: Local; Action: Local

MSI (s) <process info>: Component:


__Simple789012345678901234567890123456789065; Installed: Null; Request: Local;
Action: Local

Answer

Windows Installer performs disk costing to determine the amount of space required for
the setup. It associates cost at the component level. The cost associated to an individual
component is based upon the files that it installs and the Directory_ reference. However,
there are cases where a component can actuall install resources into locations other than
the Directory_ reference. In order to account for that, and to more accurately adjust
costing when a Directory location changes (such as when the user alters the
InstallLocation), the Installer uses a mechansim called cost-linking. For each alternate
directory for the component, the Installer creates a new temporary component, called a
subcomponent. The format of the component is a double under bar prefix (__) followed
by the first 40 characters of the component name followed by a number.

Cost-Linking is used to account for the following tables:

• Shortcut
• RemoveFile
• MoveFile (both source and destination folders)
• DuplicateFile
• Registry
• IniFile
• ReserveCost

Cost-linking is also used for all global/shared assembly components (both urt and win32)
and for the new MSI 3.X baseline cache management for patched files (only when a new
patch is applied).

So, for example, let's look again at the InstallValidate action dump from above for an
example setup where the component installs both a file and a registry key:

Action start <time>: InstallValidate.

MSI (s) <process info>: Feature: Simple; Installed: Absent; Request: Local; Action:
Local

MSI (s) <process info>: Component:


Simple7890123456789012345678901234567890123456789012345; Installed: Absent;
Request: Local; Action: Local

MSI (s) <process info>: Component:


__Simple789012345678901234567890123456789065; Installed: Null; Request: Local;
Action: Local

Note the subcomponent highlighted in red. That component was created to account for
cost associated with the registry key. It's a cost-linked component for the component +
WindowsFolder directory. The component's current cost (for the parent) is associated
with the SimpleDir directory which is the authored directory for the component in the
Component table. At this point, the component doesn't have any previously created child
components so it starts with a suffix of 65. Also, only the first 40 characters were used of
the component name (which had 55 characters).

Question 57
Background

For background on subcomponents, see Why does the Windows Installer log list
apparently duplicate components prepended with double underscore and appended with
65?

A careful reader will notice a problem with the subcomponent generation algorithm. See
it? It's the component name is based off the first 40 characters of the component. What
happens if the the first 40 characters of all the components in a package are identical?

The Windows Installer has code to look for collisions and increment an index until one is
not found. Turns out there's a arbritary limit of 100 iterations of that loop.

Troubleshooting Package

Here's why the simplified repro package suffers from the problem

You have 74 components in the Component table in this package. Of those 74


components, 70 have the same 41 character prefix:
PUBLIC_HIDEAPP_OAK_LIB_MIPSIV_FP_RETAIL__. What we're hitting here is the
MaxTry limitation. In the installation package, there are three tables that result in cost-
linking: Shortcut, IniFile, & MoveFile. The Shortcut table can be ignored because it
doesn't use one of the 70 components with the same 41 character prefix. The IniFile and
MoveFile tables are important.

Starting with the IniFile table: There are 35 components of the 70 that are listed in the
table. Each component ends up being cost-linked to two directories. That means that two
temp components are created for each component in the table. So, we have cost-linking
of the component to the CRC directory and cost-linking of the Component to the
WindowsFolder directory. Even with the child component account, you'll still start to hit
a problem. (Each component will end up with 1 child component after the first run of
cost-linking the CRC component).

By the end of this, we've used up 70 cost-link names. We only have about 100 available
because of the MaxTries amount and the fact that only the first 40 characters are chosen.
So we have temp components:

__PUBLIC_HIDEAPP_OAK_LIB_MIPSIV_FP_RETAIL_65

__PUBLIC_HIDEAPP_OAK_LIB_MIPSIV_FP_RETAIL_66

...

__PUBLIC_HIDEAPP_OAK_LIB_MIPSIV_FP_RETAIL_135
Now we move on to the MoveFile table. There's a possibility of two cost-linked
components created per row. However, the source and destination folders in this package
authoring are the same, so there'll only be one cost-linked component per row. Note that
the directory used here was not one that was used in the IniFile table (if it was, we
wouldn't need to create a new cost-linked component for it). There are 35 rows reprsented
in the MoveFile table for these 70 components. That makes 35 more temporary
components that have to be created since all of the rows represent unique components
and new directories.

Well, now we've hit the 100 limit. 70 + 35 = 105 so we bomb out for the temp component
creation. This cost-linking starts at:

__PUBLIC_DIRECTX_OAK_LIB_MIPSIV_FP_RETAIL_136

...

__PUBLIC_DIRECTX_OAK_LIB_MIPSIV_FP_RETAIL_165

__PUBLIC_DIRECTX_OAK_LIB_MIPSIV_FP_RETAIL_166 // FAILURE!

It fails at suffix 166 because it's already exhausted the max tries value.

Normally this isn't a problem because you don't usually hit the subcomponent name
limitation. Most component names differ within the first 40 characters, and even if not,
there aren't enough similarities to hit the iMaxTries upper limit. It just so happens that
this is the case with the way these packages are built. If you guarantee uniqueness within
the first 40 characters of all components, you won't have any issues.

What you'd normally expect to see would be something like the following if your
components didn't include that same 41 character prefix:

IniFile table results:

__MSGSNET___PDB65 (cost-link for WindowsFolder)

__MSGSNET___PDB66 (cost-link for CRC)

__MSMSGS___LIB65 (cost-link for WindowsFolder)

__MSMSGS___LIB66 (cost-link for CRC)

__MSMSGS___PDB65 (cost-link for WindowsFolder)

__MSMSGS___PDB66 (cost-link for CRC)

__MSMSGS_QVGA___LIB65 (cost-link for WindowsFolder)


__MSMSGS_QVGA___LIB66 (cost-link for CRC)

...

MoveFileTable results:

__DSRTP___LIBB65 (cost-link for


PUBLIC_HIDEAPP_OAK_LIB_MIPSIV_FP_RETAIL__DSRTP___LIB)

__DYNDLL___PDBB65 (cost-link for


PUBLIC_HIDEAPP_OAK_LIB_MIPSIV_FP_RETAIL__DYNDLL___PDB)

...

But because you have the same 40 characters in your package (actually 41), you end up
with all of the collissions and end up maxing out because you hit the upper limit for
subcomponent name generation.

If you want to make your packages work, you'll need to alter your component name
generation. In particular, ensure that the first 40 characters are unique.

Question 58

I’ve got a report of error 2356 "Could not locate cabinet in stream: [2]." which says a
cabinet is missing from the stream. How can I see the streams that are in the MSI and
once I know the names, how can I extract them?

Answer

Wistream.vbs can list the streams in the database. You can use msidb.exe to extract them
(msidb.exe /?)

The full suite of scripts, including Wistream.vbs is available in the Windows Installer
SDK which is a portion of the Windows Platform SDK.

Question 59

We’re trying to install our MSI without having it listed in Add/Remove Control Panel
using (as per documentation I found in the MSDN):

ARPSYSTEMCOMPONENT=1

We’ll then manually add an entry in the registry


(CurrentVersion\Uninstall\SomethingPretty) to our Setup wrapper to handle maintenance
modes. But I can’t seem to uninstall this MSI once I set the above property as we get the
error "This action is only valid for products that are currently installed. We're just using
msiexec /x product.msi

Answer

You should specify the ProductCode – not the product.msi itself – as the parameter. Look
at some ARP entries for other MSI products installed on the system for some examples.

Question 60

When I uninstall with our application running, the folder that contained the app is not
removed after reboot. Now I know the documentation for the RemoveFolders action says
that if the folder is not empty it won’t remove the folder. However after the reboot, the
folder is empty, shouldn’t it be scheduled for deletion after reboot as well?

Answer

There is a known issue when a folder held in use (that is empty) and not deleted during
uninstall.

Content credit also belongs to

• Carolyn, MSI Team Dev Lead. You can get other Carolyn insights about
developing for Windows Installer from the Windows Installer Chat Archives

[Author: Robert Flaming]

This posting is provided "AS IS" with no warranties, and confers no rights. Use of
included script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm.

Published Monday, August 22, 2005 7:00 AM by Windows Installer Team


Filed Under: Troubleshooting

Comments

# re: Folder not removed after reboot when files are in use?

Wednesday, August 24, 2005 3:08 AM by Paul

This obviously doesn't happen all the time, what triggers it? A process is holding the
empty directory? Or is it one of those "sometimes it happens sometimes it doesn't" kind
of things? Is it planned to be fixed in a future release of the installer engine?

Question 61
I am presently trying to automate patch builds for my product code, and I am using
msimsp.exe with the following command-line

Msimsp.exe –s -p -l

It pops up a confirmation dialog saying –

Target ProductVersion is greater than the Upgraded Image; do you want to proceed
anyway?

I need to know-

1. Why does this pop-up come? I am unable to figure out.


2. How do I suppress this?

Answer

Set AllowProductVersionMajorMismatches in Properties Table of PCP to confirm


Product version mismatch. See Properties Table (Patchwiz.dll)

Question 62

How can I pass the installation directory info to the custom action exe?

Answer

See MSDN Topics:

Changing the Target Location for a Directory [Windows Installer]


MsiSetTargetPath(MSIHANDLE,LPCTSTR,LPCTSTR) function [Windows Installer]
TARGETDIR property [Windows Installer]
Using the Directory Table [Windows Installer]
Specifying Directory Structure [Windows Installer]
Working with Folder Locations [Windows Installer]
Custom Action Type 35 [Windows Installer]
Custom Action Type 51 [Windows Installer]

[Author: Robert Flaming]

This posting is provided "AS IS" with no warranties, and confers no rights. Use of
included script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm.

Published Wednesday, August 24, 2005 7:00 AM by Windows Installer Team


Filed Under: Frequently Asked Questions
Comments

# re: How can I pass the installation directory info to the custom action exe?

Friday, September 30, 2005 7:04 AM by Dan

Is this the same for if you are wishing to deploy through group policy? I have an
application which runs a number of custom actions to create and copy files depending on
the values entered at install. These values are not being carried through and the files are
not being created. Does the installation directory need to be physically set for the files to
be installed in the right place ?

# re: How can I pass the installation directory info to the custom action exe?

Friday, September 30, 2005 7:05 AM by Dan

Is this the same for if you are wishing to deploy through group policy? I have an
application which runs a number of custom actions to create and copy files depending on
the values entered at install. These values are not being carried through and the files are
not being created. Does the installation directory need to be physically set for the files to
be installed in the right place ?

Question 62

How do I translate the error reported in the Windows Installer log?

Can you help me decipher the error from LastErrorRecord

FormatText :

"1: 2235 2: .\debug\ftminstall.msi 3: Value 4: UPDATE ControlCondition SET


ControlCondition.Value = 1 WHERE ControlCondition.Dialog ='FolderForm' AND
ControlCondition.Control='AllUsersRadioGroup' and ControlCondition.Action='Hide'
"

Hex(err)= 80004005

Err.description= "OpenView,Sql"

Answer

There are two contexts here: Windows Installer errors and messages from the layer(s)
under us

For windows installer,


1. look at the first field (in this case 2235)
2. look at Windows Installer Error Messages for the error: in this case 2236
Database: [2]. Invalid operator '[3]' in SQL query: [4].
3. Substitute the [#] with the # from the log.

For the underlying layer, the way I look up eight digit errors that start with 8 is

1. open a VS Command shell


2. run errlook
3. copy the error string
4. paste it into errlook
5. hit OK

I believe this is “Unspecified error”

[Author: Robert Flaming]

This posting is provided "AS IS" with no warranties, and confers no rights. Use of
included script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm.

Published Thursday, August 25, 2005 7:00 AM by Windows Installer Team


Filed Under: Troubleshooting

Comments

# re: How do I translate the error reported in the Windows Installer log?

Thursday, August 25, 2005 10:23 AM by Lon Wergin

It appears that the errlook utility requires that values entered as hexadecimal values
include the '0x' qualifier. So, for the given example, entering "0x80004005" produces the
the message "Unspecified error". However, entering "80004005" produces an error dialog
with the message "Message not found".

Question 63

How do I AppSearch for Dot Net Framework?

Answer

The official registry key/value to check is HKLM\Software\Microsoft\NET Framework


Setup\NDP\@Install=1. Of course, this key/value has the same issue as you mention
below because the version will continue to change until 2.0. Previous versions of the
framework will sit here too.
Content credit also belongs to

• Aaron, Windows Media Center PM. You can get other Aaron insights about
developing for Windows Installer from Aaron's Blog

[Author: Robert Flaming]

This posting is provided "AS IS" with no warranties, and confers no rights. Use of
included script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm.

Published Friday, August 26, 2005 7:00 AM by Windows Installer Team


Filed Under: Design Pointers

Comments

# re: How do I AppSearch for DotNet Framework?

Friday, August 26, 2005 7:06 PM by Heath Stewart

Actually, the NDP version is in there (implied by the statement "because the version will
conitnue to change" so the path is more like ...\NDP\v1.1.4322\@Install=1 for .NET 1.1.

Also note that these values don't exist for .NET 1.0 on Tablet PC and eHome (Media
Center) and you have to use an alternative means to determine if .NET is installed. See
http://blogs.msdn.com/astebner/archive/2004/09/14/229802.aspx for details.

# re: How do I AppSearch for DotNet Framework?

Friday, August 26, 2005 9:04 PM by astebner

Heath is correct. The full path to the registry value to use to detect the presence of the
.NET Framework 1.1 is HKLM\Software\Microsoft\NET Framework
Setup\NDP\v1.1.4322\@Install=1

The major/minor version for the .NET Framework 2.0 has been locked down now too. So
the detection for that will use HKLM\Software\Microsoft\NET Framework
Setup\NDP\v2.0.50727\@Install=1 once 2.0 ships.

Also, I have posted sample code that might be useful in this problem space. It can be used
by a bootstrapping program to detect the presence or absence of the .NET Framework 1.0
or 1.1 and service pack level for each. You can find more info about that at
http://blogs.msdn.com/astebner/archive/2004/09/18/231253.aspx.

# re: How do I AppSearch for DotNet Framework?


Saturday, August 27, 2005 11:36 AM by Phil Wilson

What am I missing here? Why would you AppSearch for the framework when there's the
MsiNetAssemblySupport property to tell you if it's installed? I can't think of a scenario
where AppSearch would be useful when there's a property for presence of the framework.

Question 64

How to manage order dependencies between AppSearch entries?

In my case, I want a RegLocator to check for a path out of the registry and then I want
Signature.Parent to use the path results of the RegLocator. Here's my implementation in
tables...

AppSearch

Property Signature_
INSTALLDIR TeleFormIni
CSCORE FileSearchCsCore

DrLocator

Signature_ Parent Path Depth


FileSearchCsCore [INSTALLDIR] 0

IniLocator

Signature_ FileName Section Key Field Type


TeleFormIni TeleForm.ini TeleForm TeleForm Workstation Directory 0

Signature

Signature FileNa MinVersi MaxVersi MinSi MaxSi MinDa MaxDa Languag


me on on ze ze te te es
FileSearchCsC cscore.dl9.1.0.9124 9.1.0.9140 1033
ore l

With this authoring INSTALLDIR (resolved by the IniLocator) does not resolve by the
time I need to use it in the DrLocator.Path

Answer
Unless the order is explicitly specified in the table via an "order" column or guaranteed
through some method explained in the documentation, you should NOT rely on or
assume any particular ordering within a table.

The concept of "order" in an MSI table is specious. MSIs are relational databases with no
inherent order. Maintaining order in a table is not a guarantee of the MSI file format, and
therefore any operation that touches the MSI file is perfectly within its rights to
completely reorder the rows in the table inside the file. Simply opening and closing the
MSI file could reorder the rows, as could "save as...", or poking the summary info, to say
nothing of any operation that actually updates table data such as patch application or
transform customization. Even then, nothing in the MSI SQL engine guarantees a
particular retrieval order unless the SQL statement includes an ORDER BY clause. And
nothing says Orca has to show the rows in a particular order either, unless you've sorted
on a column and even that is merely a UI change. In fact there are scenarios where Orca
does NOT show things in the order retrieved from the database.

Do not try to reverse engineer the behavior of the table processing. It could work fine by
pure luck for months or years and then your third patch causes things to go crazy - you'll
never know.

Off-line it was suggested to me that if there was specific sequencing required, one should
use custom actions explicitly sequenced in the appropriate sequence table.

Editorial Clarification

MSI MVP Stefan Krueger pointed out that the original post (without the tables) did not
make sense in the light of MSDN article Searching for a Directory and a File in the
Directory. After reading through the original query, the code and the SDK, I believe
pinpointed the problem in the authoring. One can't use the value of the Property but one
can connect the dots using the Parent column and pointing it to the earlier Signature_.

DrLocator

Signature_ Parent Path Depth


FileSearchCsCore TeleFormIni 0

Content credit also belongs to

• Chris, Microsoft Dev and former MSI Dev. You can get other Chris insights
about developing for Windows Installer from the old Windows Installer Chat
Archives

[Author: Robert Flaming]


This posting is provided "AS IS" with no warranties, and confers no rights. Use of
included script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm.

Published Saturday, August 27, 2005 11:59 AM by Windows Installer Team


Filed Under: Design Pointers

Comments

# re: How to manage order dependencies between AppSearch entries?

Saturday, August 27, 2005 3:45 PM by Stefan Krueger

Searching for a Directory and a File in the Directory (


http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/msi/setup/searching_for_a_directory_and_a_file_in_the_directory.asp) seems to
suggest that you CAN defined dependencies between searches. In this sample it will first
search for the Folder, then use the result to search for a file in that folder. Specifying the
signature of the first search in the Parent column of the second search seems to do the
trick. Or am I misunderstanding that sample?

# re: How to manage order dependencies between AppSearch entries?

Saturday, August 27, 2005 6:34 PM by Dennis Bareis

Hi,

I'm hoping the Windows Installer team look further into problems similar to the above.
Each request is a need that Windows Installer is not currently meeting. It would be nice
(where possible) for Windows Installer to be updated to support more ordering. For
example I doubt it would be very hard to add an ordering column to the "SelfReg" table
(a common issue in posts).

My 2 cents worth,
Dennis Bareis

Question 65

Any tips on troubleshooting Error 2259: Database: foo.msi Table(s) Update failed?

What column in the update is causing the update to fail?

UPDATE ControlCondition SET ControlCondition.Condition = '1' WHERE


ControlCondition.Dialog_='FolderForm' AND
ControlCondition.Control_='AllUsersRadioGroup' AND ControlCondition.Action='Hide'
Based on orca, and reading the ms.chm, this command should work but instead

Msi API Error 80004005: Execute,Params

1: 2259 2: foo.msi 3: 4:

Answer

You're trying to update a primary key column. You can't do that with an update. You
have to delete the existing row and then add a new row.

See SQL syntax Windows Installer MSDN topic:

Modify existing UPDATE {table-list} SET {column}= {constant} [,


records in a table {column}= {constant}][, ...] [WHERE {operation-list}]

UPDATE queries only work on nonprimary key columns.

See ControlCondition Table Windows Installer MSDN topic:

The ControlCondition table has the following columns.

Column Type Key Nullable


Dialog_ Identifier Y N
Control_ Identifier Y N
Action Text Y N
ConditionConditionY N

Content credit also belongs to

• Carolyn, MSI Team Dev Lead. You can get other Carolyn insights about
developing for Windows Installer from the Windows Installer Chat Archives

[Author: Robert Flaming]

This posting is provided "AS IS" with no warranties, and confers no rights. Use of
included script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm.

Published Sunday, August 28, 2005 7:00 AM by Windows Installer Team


Filed Under: Troubleshooting

Comments
# re: Any tips on troubleshooting Error 2259: Database: foo.msi Table(s) Update
failed

Wednesday, August 31, 2005 1:05 AM by RB

I will delete the row and insert again. This is ok for normal case.
I have one problem on inserting this data to condition column.'REMOVE=""'
I use wnrunsql.vbs for inserting. my problem is - "" (double quotes is not show in orca).
How can I solve this problem?

# re: Any tips on troubleshooting Error 2259: Database: foo.msi Table(s) Update
failed

Wednesday, September 07, 2005 11:27 AM by Viswanath

i was not able to update the Display Column (it is not a primary key) of the feature table
from vb script and it gave me the same 2259 error

Question 66

Is there a way to set ACLs for a service using MSI standard actions or is a custom action
required? If this can only be done through a custom action, does someone have an
existing CA that sets service ACLs that I could use?

Answer

No, there is no standard action to support this. The WiX toolset has custom action
support for this. The CustomAction is very self-contained. The custom action you’ll be
looking for is called SecureObj or Secure Objects.

Question 67

Can someone comment on what consequences would there be if the following ICE27
exceptions were left as is?

'SetODBCFolders' Action in AdvtExecuteSequence table in wrong place. Current:


Execution, Correct: Selection

Action: 'SetODBCFolders' in AdvtExecuteSequence table must come before the


'InstallValidate' action. Current seq#: 1100. Dependent seq#: 300.

'ValidateProductID' Action in InstallExecuteSequence table in wrong place. Current:


Execution, Correct: Search

Answer
These ICE errors indicate wrong sequences of standard actions. You need to correct
them. SetODBCFolders action needs to come before InstallValidate action, otherwise the
target directory for ODBC driver will not be set correctly. ValidateProductID action
needs to come before RegisterUser action.

Question 68

How can I use a custom action to dynamically populate rows in the table?

Answer

Immediate custom actions have full access to the Windows Installer database. All you
need to do is use the database API to open a view and execute the view. The rest is the
SQL query you create that performs an insert of a temporary row in the database. All of
this, the APIs + SQL queries, are documented on MSDN in the Windows Installer
documentation. If the table needs to be around in memory so that your changes aren't lost
when dropped from view, then add a hold count to it (and release the hold count at the
end after the requisite action runs).

• MsiGetActiveDatabase
• MsiDatabaseOpenView
• MsiViewExecute

 Question 69

Can anyone tell me how to make a universal transform or a template transform that will
work on all msi's?

Answer

The trick is to get the validation conditions on the transform to be lenient.

The following validation conditions are available for a transform (these are stored in the
transform's summary information stream):

MSITRANSFORM_VALIDATE_LANGUAGE

MSITRANSFORM_VALIDATE_PRODUCT

MSITRANFORM_VALIDATE_UPGRADECODE

Any one of the following version specifications (which would also have a validation
equality flag as well)

MSITRANSFORM_VALIDATE_MAJORVERSION
MSITRANSFORM_VALIDATE_MINORVERSION

MSITRANSFORM_VALIDATE_UPDATEVERSION

You would basically want to not validate any of the transform validation conditions that
ensure product code, upgrade code, product version, and product language matching.

Depending on the types of changes you are making, you may want to suppress all of the
error conditions as well to ensure that the transform can be applied without failure.

More specifics on the transform summary information stream can be found in the
MsiCreateTransformSummaryInfo API documentation.

You can easily accomplish this using the msitran.exe tool provided in the Windows
Installer SDK development tools section.

A no validation suppress all error transform would be generated using something similar
to:

msitran -g simple.msi simple2.msi simple.mst abcdef

Hope this helps,


- Carolyn Napier
Microsoft Windows Installer Team

Windows Installer Appears Every Time a Program is Started

Question 70

OS: Windows XP Home SP2 with Automatic updates every day at 3AM; Machine:
Toshiba Satellite M35X-S311; 80% of hard drive free.

My trial version of Office 2003 expired 1/31/06 (no warning messages received prior). I
couldn't access Control Panel (system32/CoPM.cpl error). No System Restore points
prior to 1/31/06.

Ever since 1/31/06, windows installer pops up on every application (explorer, print,
office). "Preparing to Install just hangs there for a couple of minutes -- for everything.

Spyware, adware and malware has been scanned and removed. I've also had my machine
scanned by Hijack this, Norton SystemWorks and Registry Mechanic, and no problem
can be found.

I've been to the MS support pages, and have tried

1. update installer (did not help)


2. Modify the Registry (article 265194; effective for Office 2000)
3. I've downloaded Windows Install Cleanup, but am not experienced enough to
handle any problems that may ensue

I can't begin to tell you how much this affects my work. I've lost 5 days of writing --
which is how I earn my living -- and I'm obsessed with getting my computer back the
way it used to be.

Please tell me how to fix this -- this is a major disaster for me.

Answer

I'm sorry to hear you're having these problems. It sounds like it's quite frustrating and
you've run out of options. If the following information doesn't allow you to unblock
yourself, I encourage you to call Microsoft Product Support Services.

I try and answer question in three parts:

1. why is this happening?


2. what is really failing?
3. how can I fix this?

• Why is this happening?

Creating stable corporate computing platforms was a pillar for the Total Cost of
Ownership initiative for the Windows 2000 generation of releases. Part of that
effort was the Windows Installer Resiliency features. In the controlled
environment of corporate computing, these errors do not occur because the
accompanying infrastructure is maintained to automatically respond to these
issues thereby reducing total cost of ownership for the corporate customer.

Generally, home computers are subject to much less supervisory oversight and
assistance. Without the help of a professional administrator, the quality of the
application experience on Windows is at the discretion of the software vendor.
Software vendor do make mistakes with the Windows Installer Resiliency
features and thus you have this experience.

This specific problem is frequently written about in periodicals user assistance


columns. I noted this in the blog entry "Stop Installation Idiocy" PCWorld's
Hassle Free PC article

• What is really failing?

The Windows Installer Frequently Asked Questions has FAQ items titled:
o Every time I launch my application, Windows Installer performs an
installation. How can I determine the cause of the on-demand installation?
o How can I figure out why my package fails to install?

These entries will allow you to turn on Windows event logging and Windows
Installer package logging which enable you to determine the which executable
(client) and application (package) are providing misinformation to the Windows
Installer service.

Behind the covers, it kind of works this way

o a client program is trying to assure the correct state of an application.


o a client is calling a Windows Installer API (such as
MsiGetComponentPath)
o either
 the system is in an inconsistent state and thereby unable to fulfill
the request
 two or more packages installed to the system are inconsistent
creating a conflict on the system.
o the sequence of system (Windows Installer system service) and
application (client code and application packaging) functionality is unable
to correct the triggering state thus the event is triggered again
• How can I fix this?

Generally, start by contacting the Software Vendor(s) that is (are) causing the
problem. The event and install logs enabled by the above should allow you to find
the offending combination. As a PC is actually a commons, there may be more
than one Software Vendor involved. The Software Vendor should be able to tell
you how to repair their applications. This is a well traveled troubleshooting route
traveled by corporate administrators.

Some home users will give up at this point because they don't have the time or
geek-like persistence to work through all the details. Other home users will say
they don't have media any more, the software company does not exist any more,
or that was an unofficial copy of the application. Still others find their software
provider unable to help them due to lack of knowledge, lack of experience, or a
propensity to blame the other software provider.

Boiler plate suggestions from an ISV may include (in no particular order)

o Repair (msiexec /famus ...)


o Uninstall and reinstall (msiexec /x ... followed by msiexec /i ...)
o Install again (msiexec REINSTALLMODE="famus" /i ... )

You should be able to try this on your own too.


MSIZap is the the Windows Installer tool that offers to disconnect the Windows
Installer portion of the chain. MSIZap just operates on the Windows Installer
store of information. MSIZap does not touch the the resources (files and registry
keys) of the application. By using MSIZap to remove Windows Installer's
knowledge of the application, the calls to the Windows Installer APIs will fail due
to unrecognized parameters. The risk to removing the Windows Installer internal
data is in how well the client that is calling the Windows Installer APIs responds
to return codes (INSTALLSTATE_UNKNOWN for example). From the
Windows Installer point of view, MSIZap is a tool of last resort as it eliminates
Windows Installer from the equation.

As one will note in the "Stop Installation Idiocy" PCWorld's Hassle Free PC
article, MSIZap is a choice user assistance columnists choose to call out.

Hope this helps...

[Author: Robert Flaming]

This posting is provided "AS IS" with no warranties, and confers no rights. Use of
included script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm.

Published Sunday, February 05, 2006 10:13 AM by Windows Installer Team


Filed Under: Frequently Asked Questions, Troubleshooting

Comment Notification

If you would like to receive an email when updates are made to this post, please register
here

You can also stay up to date using your favorite aggregator by subscribing to the
CommentRss Feed

Comments

# re: Windows Installer Appears Every Time a Program is Started

Monday, February 13, 2006 6:00 PM by Ellery

That looks like a KB doc if I've ever seen one.


The reason that windows installer is coming up in this case is that the user has a
corrupted install that has installed a shared component. Most likely comctl, or oleaut32.
The other programs that are triggering the repair are likely just calling into a shared
COM object and that is what is triggering the repair.

To figure out which installer is failing you have to look in your windows "Event Log".
This is a log of activity on your windows NT based OS. To get to the event log right
click on "My Computer" and select manage. In the list on the left you'll see "Event
Viewer" Select that and then select "Application". If you sort by "Source" You'll see a
huge number of MsiInstaller entries. Looking through those entries will tell you who the
culprit is. If you either uninstall and re-install the offending software or MsiZap the
offending software you'll probably be back in buisiness.

Note that MsiZap can leave your computer in a weird state so that you'll have problems
installing new versions of the software that you've zapped so this should only be used as
a last resort.

# re: Windows Installer Appears Every Time a Program is Started

Tuesday, February 14, 2006 7:26 PM by ivan gomez

el equipo se apago solo

# re: Windows Installer Appears Every Time a Program is Started

Friday, February 24, 2006 2:23 PM by Jon

Where do I file Windows Installer bugs??

# re: Windows Installer Appears Every Time a Program is Started

Saturday, February 25, 2006 11:17 PM by LinWinOverlord

Unless you are a person who works at MS, email the team....

=================================================

QUESTIONS FROM WINDOWS XP

1. What is System Restore?

System Restore is a feature of only the Windows XP Professional, Windows®


Me, and Windows® XP Home Edition operating systems. Users can use System
Restore to reverse harmful changes to their computer caused by installing or
uninstalling applications. This feature enables the user to return the computer to
an earlier state known as the restore point
We can use the %SystemRoot%\System32\restore\rstrui.exe for a system restore
point

2) What is Differences between Regedit.exe and Regedt32.exe?

Windows NT-based operating systems include two utilities for editing the registry,
Regedit.exe and Regedt32.exe

In Windows XP and Windows Server 2003

Regedit.exe

Regedit.exe is the configuration editor for Windows XP and Windows Server 2003.
Regedit.exe is used to modify the Windows NT configuration database, or the Windows
NT registry. This editor allows you to view or modify the Windows NT registry. It
supports setting security on registry keys, viewing and editing REG_EXPAND_SZ and
REG_MULTI_SZ, and saving and restoring hive files. On the left side, there are folders
that represent registry keys. On the right side, there are the values associated with the
selected registry key. Regedit is a powerful tool. You must use extreme caution when you
use it to change registry values. Missing or incorrect values in the registry can make the
Windows installation unusable.

Regedt32.exe

In Windows XP and Windows Server 2003, Regedt32.exe is a small program that


just runs Regedit.exe

3) What is a SERVICE and what are the basic services which open when we start an
log in?

A program, routine or process that performs specific function to support other programs
particularly at low level (Close to Hardware Level).

It’s a program that runs invisibly in the background. Services load and start running
whether or not anyone logs into the computer.

Svchost

Svchost.exe is a generic host process name for services that run from dynamic-link
libraries (DLLs).

The Svchost.exe file is located in the %SystemRoot%\System32 folder. At startup,


Svchost.exe checks the services part of the registry to construct a list of services that it
must load. Multiple instances of Svchost.exe can run at the same time. Each Svchost.exe
session can contain a grouping of services. Therefore, separate services can run,
depending on how and where Svchost.exe is started. This grouping of services permits
better control and easier debugging.

Default Processes (run at start up)

Explorer.exe

Spoolsv.exe (Spooler Service)

Svchost.exe

Services.exe (Service Control Manager)

Taskmgr.exe

Winlogon.exe (manage user logon and logoff)

Grant rights to services: using Subinacl.exe

Note: Application files that can be installed as a service are: .EXE, .VXD, .SYS, or .386

====================================================

What command line switches are supported?hat command

QUESTIONS ON VB SCRIPTS and ACTIVE DIRECTORY

1. What is a GPO?

GPO stands for Group Policy object and GPO is an active directory object and using
GPO we can publish and assign packages to users or computers. Apart from that GPO is
also used to control the user and computer con

2. Difference between publishing and assigning an application in a GPO?

Publishing is done to the user

Assigning is done to user and computer

Assigning will create the entry point

Publishing will install the application when user invoke the program will get install
locally.
3. On Which container you find the GPO in active directory?

Domain. And OU.

4. What is DFS?

Distributed File system.

5. Do create two separate MSI for windows 2000 and windows XP and why?

Yes we will create the different MSI for windows 2000 and XP

Because windows 2000 and XP will have different type kernal, dll version, and Cab file.

6. What is WSH?

Windows Scripting host 2.0

7. Difference between VBS and WSH?

VBS is not OS related scripting it is Web Scripting

WSH is an interpreter between OS and Scripting.

WSH is language independent Administration tool

WSH will allow to run any script.

8. which language you use in WSH?

Vbscripting, J-script, pearl Script.

9. what is the file extension for vbsript and WSH?

.VBS

WSH is an Engine doesn’t have any extensions.

10. What is double byte in VBS ?

11. Explain objects in WSH?

Network object
Shell object

12. Objects in VBS?

Example of objects in VB scripts

CreateObject

GetObject

SetObject

Err Object

RegExp

The Err object is an intrinsic object with global scope — there is no need to create an
instance of it in your code. The properties of the Err object are set by the generator of an
error — Visual Basic, an Automation object, or the VBScript programmer.

Use the GetObject function to access an Automation object from a file and assign the
object to an object variable. Use the Set statement to assign the object returned by
GetObject to the object variable. For example:

14. Objects in wsh shell and wsh network?

Network object: Provides access to common networking tasks, for example. connecting
a network drive.

Shell object: General purpose object that provides useful methods for manipulating
Windows OS that lets you access all the main features of the OS's GUI. information —
for example, registry access

15. Syntax of creating an object in vbscript ?

Set objRootDSE = GetObject("LDAP://rootDSE")


Set objContainer = GetObject("LDAP://OU=Droitwich," & _
objRootDSE.Get("defaultNamingContext"))

16. How do you define a variable in VBScript?

Dim <Variable>

17. Option explicit in VB Script?


Note 1: Option Explicit is the first line of the VBScript (apart from the ' Remarks). My
point is that you cannot introduce Option Explicit after the DIM statements.

The simple statement - Option Explicit - tightens up your scripts. What Option Explicit
says is this: if a variable is not declared, then you cannot use it. The use of Option
Explicit is twofold, to make sure that you declare variables, and to troubleshoot by
generating errors to highlight mistakes if variable names are mistyped later in the script.

18 What is ADSI?

Active directory services Interfaces. Use to edit the schema

19. What is WMI, explain it and can you script it ?

The "Windows Management Instrumentation" service winmgmt "Provides a common


interface and object model to access management information about operating system,
devices, applications, and services. If this service is stopped, most Windows-based
software will not function properly. If this service is disabled, any services that depend on
it will fail to start."

20. Have you deployed Office packages?

Yes. But lot big operation is done on that.

21. How do you create multiple languages in ms office

Using the .MST, and using ORK tool (Office Resources kit)

How will you install SQL scripts in wise

How you can provide the data during run time?

Explain the concept of nested MSI

What do you means by Default feature and what if the default feature is removed from
the application and the MSI is installed , will it install or not

REMOVE~=ALL is the condition to check the condition during uninstallation

How will you install Files to a particular user profile in MSi?

A user launches a shortcut an it gives an error message “ you don’t have the sufficient
previlages “ what may be the reason for that ?( The exe of the shortcut may be
generating a runtime file during launch and the user doesn’t have the write acess to that
particular folder location)

This is the Microsoft knowledge base for MSi

http://support.microsoft.com/default.aspx?scid=fh;EN-US;KBHOWTO

MSI BLOG for all the queries :

http://blogs.msdn.com/windows_installer_team/archive/category/10544.aspx

http://www.wise.com/KBSearch.aspx

Remember, the Revision Number summary property is used to store the

unique Package Code, which is a GUID. You must change this to a different

GUID if you make any change to a package, no matter how minor.

OBJECTIVE QUESTION AND ANSWERS :

http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/odc_xl2003_ta/html/odc_super.asp …EXCEL MACRO writing website
ICEERRORS

ICE01

What does ICE01 check?

ICE01 validates that the ICE mechanism is working. It does not test anything.
This ICE uses the Time property to get the time and returns either the system
time or None.

When does ICE01 show up?

Unless there is a problem with the ICE mechanism, ICE01 should never return
an error.

Where can I get more information?

Microsoft Platform SDK - ICE01

ICE02

What does ICE02 check?

ICE02 validates that certain references between the Component, File, and
Registry tables are reciprocal. These references must to be reciprocal for the
installer to correctly determine the installation state of components.

Key path value used for a component in the Component table must be the
primary key of a record in the Registry or File tables depending on the type of
key path. In addition, the value used under Component_ column of File or
Registry tables must be the primary key of the corresponding record in the
Component table. Hence, the references must be reciprocal.

When does ICE02 show up?

ICE02 posts an error message if it finds a reference that is not reciprocal.

How can I fix ICE02?

You will need to modify the record so that the reference can be reciprocal.

Where can I get more information?

Microsoft Platform SDK - ICE02

ICE03
What does ICE03 check?

ICE03 checks the data types and foreign keys based on the _Validation table
and the database tables in the .msi file. The _Validation table is a system table
that contains the column names and the data types for all of the tables in the
database. It is used during the database validation process to ensure that all
columns are accounted for and have the correct values.

When does ICE03 show up?

ICE03 typically posts an error if a data value is not permitted based on the data
type and table information stored in _Validation Table.

Brief descriptions of the ICE03 errors are listed below:

Duplicate Primary Key


The primary keys of a new row duplicates the primary keys of an existing row.
The Nullable column of the _Validation table shows the primary keys in the
database.

Not A Nullable Column


A table column that is not specified as nullable in the Nullable column of the
_Validation table contains an entry that is Null.

Not A Valid Foreign Key


A column that is a foreign key into a second table contains an entry that does not
exist in the primary key of the second table.

Value exceeds MaxValue


The numeric value of an entry in a database table exceeds the maximum limit
specified for this field in the MaxValue column of the _Validation table.

Value below MinValue


The numeric value of an entry in a database table is less than the minimum limit
specified for this field in the MinValue column of the _Validation table.

Value not a member of the set


The value of an entry in a database table is not a member of the acceptable set
of values specified for this field in the Set column of the _Validation table.
Invalid version string
Version number is not an acceptable value. The Version data type is a text string
containing a valid version string. A version string has the format
xxxxx.xxxxx.xxxxx.xxxxx where x is a digit.

All UPPER case required


Lowercase values are not allowed. The UpperCase data type is a text string that
must be all uppercase.

Invalid GUID string


Globally Unique Identifier used is not an acceptable value. The valid format for a
GUID is {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} where X is a hex
digit (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F). Note that utilities such as GUIDGEN can
generate GUIDs containing lowercase letters. These must all be changed to
uppercase letters before the GUID can be used by the installer as a valid product
code, package code, or component code.

Invalid file name/usage of wildcards


The database contains an invalid file name or an incorrect wildcard. The
WildCardFilename data type is a Filename that may also contain the wild card
characters "?" for any single character or "*" for zero or more occurrences of any
character. The Filename data type is a text string containing a file name or
folder. By default, the file name is assumed to use short file name syntax; that is,
eight-character name, period (.), and 3-character extension. To include a long file
name with the short file name, separate it from the short file name with a vertical
bar (|).
Short and long file names must not contain the following characters:
\?|><:/*"
In addition, short file names must not contain the following characters:
+,;=[]
No space is allowed preceding the vertical bar (|) separator for the short file
name/long file name syntax. Short file names may not include a space, although
a long file name may. A space can exist after the separator only if the long file
name of the file name begins with the space. No full-path syntax is allowed.

Invalid identifier
The Identifier data type is a text string. Identifiers may contain the ASCII
characters A-Z (a-z), digits, underscores (_), or periods (.). However, every
identifier must begin with either a letter or an underscore.
Invalid Language Id
The database contains an invalid numeric Language Identifier (LANGID). The
Language data type is a text string containing one or more valid numeric
language IDs. If there are two or more language IDs, they must be separated by
commas.
See the platform SDK for a current list of Language Identifiers used by Windows.
For example, 1033 for the U.S. and 0 for language neutral.

Invalid Filename
The Filename data type is a text string containing a file name or folder. By
default, the file name is assumed to use short file name syntax; that is, eight-
character name, period (.), and 3-character extension. To include a long file
name with the short file name, separate it from the short file name with a vertical
bar (|).
Short and long file names must not contain the following characters:
\?|><:/*"
In addition, short file names must not contain the following characters:
+,;=[]
No space is allowed preceding the vertical bar (|) separator for the short file
name/long file name syntax. Short file names may not include a space, although
a long file name may. A space can exist after the separator only if the long file
name of the file name begins with the space. No full-path syntax is allowed.

Invalid full path


Only Path, AnyPath, and Paths data types are allowed. The Path data type is a
text string containing a valid full path. The string may also contain a property
name enclosed in square brackets [ ]. In such a case, the name of the property,
including the brackets, is replaced in the string by the value of the property. The
AnyPath data type is a text string containing either a full path or a relative path.
When specifying a relative path, you can include a long file name with the short
file name by separating the short and long names with a vertical bar (|). Note that
you cannot specify multiple levels of a directory or fully qualified paths in this
way. The path may contain properties enclosed within square brackets ([ ]). The
Paths data type is a text string containing a list of Path data types, separated by
semicolons (;).

Bad conditional string


The database contains an invalid conditional string. This is a text string that must
evaluate to TRUE or FALSE according to the Conditional Statement Syntax.
Invalid format string
Only Formatted data type is allowed.

The Formatted data type is a text string that is processed to resolve embedded
property names, table keys, environment variable references, and other special
substrings. The following conventions are recognized to resolve the string

• Square brackets ([ ]) or curly braces ({ }) with no matching pair are left in


the text.
• If a substring of the form [propertyname] is encountered, it is replaced by
the value of the property. If propertyname is not a valid property name,
then the substring resolves as blank.
• The square brackets may be iterated and the property names are resolved
from inside out.
• If a substring of the form [%environmentvariable] is found, the value of the
environment variable is substituted for the substring.
• If a substring of the form [\x] is found, it is replaced by the character x ,
where x is one character, without any further processing. Only the first
character after the backslash is kept; everything else is removed.
• If a substring is enclosed in curly braces ({ }), and it contains no property
names enclosed in square brackets ([ ]), the substring is left unchanged,
including the curly braces.
• If a substring is enclosed in curly braces ({ }) and it contains one or more
property names enclosed in square brackets ([ ]) then, if all the property
names are valid, the text (with the resolved substitutions) is displayed
without the curly braces.
• If a substring of the form [~] is found, it is replaced with the null character.
This is used to author REG_MULTI_SZ character strings in the Registry
table. Note that [~] is also used to append or prefix values to environment
variables using the Environment table.
• If a substring of the form [#filekey] is found, it is replaced by the full path of
the file, with the value filekey used as a key into the File table. The value
of [#filekey] remains blank and is not replaced by a path until the installer
runs the CostInitialize action, FileCost action, and CostFinalize action. The
value of [#filekey] depends upon the installation state of the component to
which the file belongs. If the component is run from the source, the value
is the path to the source location of the file. If the component is run locally,
the value is the path to the target location of the file after installation. If the
component has an action state of absent, the installed state of the
component is used to determine the [#filekey] value. If the installed state
of the component is also absent or null, [#filekey] resolves to an empty
string, otherwise it resolves to the value based upon the component's
installed state. For more information about checking the installation state
of components, see Checking the Installation of Features, Components,
Files.
• If a substring of the form [$componentkey] is found, it is replaced by the
install directory of the component, with the value componentkey used as a
key into the Component table. The value of [$componentkey] remains
blank and is not replaced by a directory until the installer runs the
CostInitialize action, FileCost action, and CostFinalize action. The value of
[$componentkey] depends upon the installation state of the component
and where it occurs. In the Value column of the Registry Table, this
substring may refer to the action state or the requested action state of the
component. In all other cases, this substring refers to the action state of
the component. For example, if the component is run from the source, the
value is the source directory of the file. If the component is run locally, the
value is the target directory after installation. If the component is absent,
the value is left blank. Windows Installer tracks both the action and
requested installation states of components.
• Note that if a component is already installed, and is not reinstalled,
removed, or moved during the current installation, the action state of the
component is null and the string [$componentkey] evaluates to Null.

If a substring of the form [!filekey] is found, it is replaced by the full short path of
the file, with the value filekey used as a key into the File table. This syntax is
valid only when used in the Value column of the Registry or the IniFile tables.
When used in other columns this syntax is treated the same as [#filekey].

Invalid template string


Only Template data type is allowed. The Template data type is a text string that
may contain properties that are enclosed in brackets [ ]. The template type allows
all of the Formatted type formats, plus [1] where 1 is a number.

Invalid DefaultDir string


Only DefaultDir data type is allowed. The DefaultDir data type is a text string
containing either a valid Filename or a valid Identifier. This is used only in the
Directory table. It must be an identifier if the directory is a root directory. If the
directory is a non-root, this value must be a filename or a filename:filename pair.
Note that "." is allowed as a file name and has special meaning in the Directory
table.

Invalid registry path


Only RegPath data type is allowed. The RegPath data type is a text string
containing a Registry path. Registry paths can include properties, as with the
Formatted data type. A RegPath may not begin or end with a backslash (\). The
[#file key] and [$component key] can be embedded in the path or preceded by
other characters.
Bad CustomSource data
Only CustomSource data type is allowed. The CustomSource data type is
either a valid Identifier or an external key depending on the Type column of the
CustomAction table. It can be an external key into the Binary table, File table,
Directory table, and Property table.

Invalid property string


Only Property data type is allowed. The Property data type is a valid Identifier
with the additional syntax "%identifier", which represents an environment
variable.

Missing data in _Validation table or old Database


There are columns in the database that are not listed in the Column column of
the _Validation table. The database and _Validation table do not match

Bad cabinet syntax/name


Only Cabinet data type is allowed. The Cabinet data type must be used in the
Cabinet column of the Media table. If the cabinet name is preceded by the
number sign, the cabinet is stored as a data stream inside the package. The
character string which follows the # is an Identifier for this data stream. Note that
if the cabinet is stored as a data stream, the name of a cabinet is case-sensitive.

_Validation table: Invalid category string


This is an error in authoring the _Validation table. Validation does not recognize
the category string used for this particular column in the _Validation table. The
following Column Data Types are specified as valid categories: Text,
UpperCase, LowerCase, Integer, DoubleInteger, Time/Date, Identifier, Property,
Filename, WildCardFilename, Path, Paths, AnyPath, DefaultDir, RegPath,
Formatted, Template, Condition, GUID, Version, Language, Binary,
CustomSource, Cabinet, Shortcut.

_Validation table: Data in KeyTable column is incorrect


The KeyTable column in the _Validation table references a table that does not
exist in the database.

_Validation table: Value in MaxValue column < that in MinValue column


This is an error in authoring the _Validation table. Min must always be less than
or equal to Max.
Bad shortcut target
Only Shortcut data type is allowed. The Shortcut data type is usually used in
the Target column of the Shortcut table. If it contains square brackets ([ ]), the
shortcut target is evaluated as a Formatted string. Otherwise, the shortcut is
evaluated as an Identifier and must be a valid foreign key into the Feature table.

String overflow (greater than length permitted in column)


The string's length is greater than the column width specified by the column
definition. Note that the installer does not internally limit the column width to the
specified value. See Column Definition Format.

Undefined error

Unknown error

Column cannot be localized


Primary key columns cannot be localized.

How can I fix ICE03?

You will need to correct the data found in the specified table based on the data
type information stored in _Validation table.

Where can I get more information?

Microsoft Platform SDK - ICE03

ICE04

What does ICE04 check?

ICE04 validates that the sequence number of every file in the File table is less
than or equal to the largest sequence number in the LastSequence column of the
of the Media table.

When does ICE04 show up?

ICE04 posts an error message if there is a file with a sequence number greater
than the largest LastSequence number for the source media.

How can I fix ICE04?


LastSequence column in Media table holds the maximum number allowed for a
sequence number of a file. In order to fix this, the largest LastSequence number
for the source media needs to be incremented.

Where can I get more information?

Microsoft Platform SDK –ICE04

ICE05

What does ICE05 check?

ICE05 validates that certain database tables contain required entries. The
following properties (i.e. Windows Installer variables) have to be present in the
Property table of any MSI file: ProductName, ProductLanguage, ProductVersion,
ProductCode, and Manufacturer.

When does ICE05 show up?

ICE05 posts an error if a required entry is not found in the database.

How can I fix ICE05?

You will need to add the required entry or entries to your installation database.

Where can I get more information?

Microsoft Platform SDK – ICE05

ICE06

What does ICE06 check?

ICE06 checks every table to validate that all the columns listed in the _Validation
table are present in the table. The _Validation table is a system table that
contains the column names and the data types for all of the tables in the
database. It is used during the database validation process to ensure that all
columns are accounted for and have the correct values. If a table does not exist,
any _Validation entries for that table are ignored.

When does ICE06 show up?

ICE06 posts an error if it detects instances in which an author tries to use a new
_Validation table that reflects a schema change with an old database that has not
been updated. ICE06 also detects the reverse case of an old _Validation table
being used with an altered database. Essentially, ICE06 will show up when there
is a table column defined in the _Validation table that is not listed in the
_Columns table.

How can I fix ICE06?

You will need to update your _Validation table or alter your MSI database
schema.

Where can I get more information?

Microsoft Platform SDK – ICE06

ICE07

What does ICE07 check?

ICE07 checks to see if the installation package is set to install fonts into the
FontsFolder (FontsFolder is a property which gets resolved to the full path of the
system Fonts folder.). If a font is installed to a folder other than the FontsFolder
the installer creates a shortcut rather than actually installing the font.

When does ICE07 show up?

ICE07 posts an error if the font file is being installed into a folder other than the
FontsFolder.

How can I fix ICE07?

You will need to specify your fonts files to be installed into the FontsFolder.

Where can I get more information?

Microsoft Platform SDK – ICE07

ICE08

What does ICE08 check?

ICE08 validates that the Component table contains no duplicate GUIDs (i.e.
Globally Unique Identifiers). Every component must have a unique GUID.
Components are storage units for application resources. They are also registered
on the target system for application maintenance. The only way for Windows
Installer to identify which resource belongs to which component is through these
unique identifiers. Components should never ever use the same GUID.

When does ICE08 show up?


ICE08 posts an error message if two or more components share the same GUID.
Technically that means two or more entries in the ComponentId column of the
Component table contain the same GUID.

How can I fix ICE08?

You will need to specify/generate unique GUIDs for each component you have in
your installation database.

Where can I get more information?

Microsoft Platform SDK – ICE08

ICE09

What does ICE09 check?

ICE09 checks to see if a file is set to be installed as a permanent resource (to be left on
the system during uninstall) under SystemFolder (SystemFolder is the property which
gets resolved to the full path of the System folder). Technically, ICE09 validates that the
permanent bit is set for every component marked for installation into the SystemFolder.

When does ICE09 show up?

ICE09 posts a warning if a file that is set to be installed under System folder is NOT
marked as a permanent resource. Installation authors should avoid installing non-
permanent system components to the SystemFolder.

How can I fix ICE09?

To prevent this warning, you should mark your files that are set to be installed under
System folder as permanent resources. Technically, you need to set the Permanent bit in
the Attributes column of the Component table for every component that is marked for
installation into the SystemFolder.

Where can I get more information?

Microsoft Platform SDK – ICE09

ICE10

What does ICE10 check?


ICE10 checks if advertisement is allowed for a child feature whose parent feature
supports advertisement. Technically, ICE10 validates that the advertise state of
child features matches that of its parent feature. A child feature may not disallow
advertisement while its parent feature allows advertisement because it would turn
off the parent whenever the parent was supposed to be advertised. However, the
reverse is allowed. A child can be marked to favor advertisement while the parent
is marked to disallow advertisement.

Note: The Windows Installer can advertise the availability of an application to


users or other applications without actually installing the application. If an
application is advertised, only the interfaces required for loading and launching
the application are presented to the user or other applications. If a user or
application activates an advertised interface the installer then proceeds to install
the necessary components as described in Installation-On-Demand.

When does ICE10 show up?

ICE10 generates an error if a child feature disallows advertisement while its


parent feature allows advertisement. Technically, ICE10 posts an error if the
Attributes column of the Feature table contains a mismatch in the advertise state.

How can I fix ICE10?

Child feature should not be set to disallow advertisement, which conflicts with the
allow advertisement state of its parent. So, you should either change the feature
state of the child or the parent. Note that it is valid to set the state of a feature to
0 and have its parent or child set to favor or disallow advertisement.

Where can I get more information?

Microsoft Platform SDK – ICE10

ICE11

What does ICE11 check?

ICE11 validates that a nested MSI installation custom action has a valid identifier
for the source. Technically, ICE11 checks the Source column of the
CustomAction table for Nested Installation custom actions. The Source column
must contain a valid GUID (MSI product code).

Note: The valid format for a GUID is {XXXXXXXX-XXXX-XXXX-XXXX-


XXXXXXXXXXXX} where X is a hex digit (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F).
Utilities such as GUIDGEN can generate GUIDs containing lowercase letters.
These must all be changed to uppercase letters before the GUID can be used by
the installer as a valid product code, package code, or component code
When does ICE11 show up?

ICE11 posts an error if the Source column of the CustomAction table is authored
incorrectly for nested installation custom actions.

How can I fix ICE11?

The source of a Nested Installation custom action must contain a valid GUID. So,
you should update the source value so that it can represent a valid MSI product
code.

Where can I get more information?

Microsoft Platform SDK – ICE11

ICE12

What does ICE12 check?

ICE12 checks the following items in your MSI database:

• CostFinalize action occurs in any sequence table containing “Set


Directory” (Type 35) or “Set Property” (Type 51) custom actions.
• Every “Set Directory” (Type 35) custom action comes after the
CostFinalize action in the sequence tables.
• Every “Set Property” (Type 51) custom action that has a foreign key to the
Directory table in the Source column of the CustomAction table comes
before the CostFinalize action in the sequence tables.

ICE12 queries the CustomAction, Directory, AdminExecuteSequence,


AdminUISequence, AdvtExecuteSequence, InstallExecuteSequence, and
InstallUISequence tables for validation.

Note: ICE12 does not validate the formatted text in the Target column of the
CustomAction table.

When does ICE12 show up?

ICE12 posts an error message if validation of the custom actions that set a
directory property fails.

How can I fix ICE12?

Since ICE12 checks more than one thing, you will need to fix your MSI based on
the specific error message returned from ICE12. You may need to do one of the
following to fix ICE12:
• Change the custom action entry in the Source column of CustomAction
table to an existing entry in the Directory table or add the new directory to
the Directory table.
• Change the custom action location in the InstallExecuteSequence table
such that it comes after the CostFinalize action.
• Change the custom action location in the InstallExecuteSequence table
such that it comes before the CostFinalize action.

Where can I get more information?

Microsoft Platform SDK – ICE12

ICE13

What does ICE13 check?

ICE13 checks if any of your installation user interface dialogs in your MSI
database are placed in ExecuteSequence tables. Technically, ICE13 validates
that dialogs in sequence tables appear ONLY in the AdminUISequence, or
InstallUISequence tables. Dialogs must not be listed in the ExecuteSequence
tables (i.e. InstallExecuteSequence, AdminExecuteSequence, and
AdvtExecuteSequence tables).

When does ICE13 show up?

ICE13 posts an error message if a dialog is found in an execute sequence table


(i.e. InstallExecuteSequence, AdminExecuteSequence, or
AdvtExecuteSequence tables).

How can I fix ICE13?

You should either completely remove the specified dialog from the execute
sequence or cut & paste it to a UISequence table (i.e. AdminUISequence, or
InstallUISequence)

Where can I get more information?

Microsoft Platform SDK – ICE13

ICE14

What does ICE14 check?

ICE14 validates the following:


• Root (top level) features must not have “Follow Parent” attribute set. A
root feature does not have a parent.
• No feature can be its own parent.

When does ICE14 show up?

ICE14 posts an error message if it finds a root feature with the “Follow Parent”
(i.e., msidbFeatureAttributesFollowParent) bit set or a feature with identical
entries in the Feature and Feature_Parent columns of the Feature table.

How can I fix ICE14?

Depending on the ICE14 error details, you will need to do one of the following:

• From your root feature, remove the msidbFeatureAttributesFollowParent


bit set in the Attributes column of the Feature table.
• Remove the value found under Feature_Parent column of the Feature
table for the feature that has the same entry in the Feature and
Feature_Parent columns.

Where can I get more information?

Microsoft Platform SDK – ICE14

ICE15

What does ICE15 check?

ICE15 validates that content type and extension references in the MIME and
Extension tables are reciprocal. The MIME table must reference a content type to
an extension that the Extension table references back to the same content type.
Multiple extensions can reference the same MIME type, as long as the MIME
type references back to one of the extensions. Multiple MIME types can
reference the same extension, as long as the extension references back to one
of the MIME types.

Note: Whenever a MIME references an extension, that extension cannot have


the MIME_ column in the Extension table set to Null.

When does ICE15 show up?

ICE15 posts an error if the content type and extension references are not
reciprocal.

How can I fix ICE15?


You will need to take a look at ContentType, and Extension_ columns of MIME
table as well as Extension, and MIME_ columns of Extension table to find if
references are reciprocal.

Note: “_” (i.e. underscore character) used in a column name is an indication of a


foreign key (i.e. primary key of another table). Such a column name also gives
you an indication about which table it links to. For example, MIME_ column of
Extension table is a foreign key that links the table to MIME table where the
primary key is ContentType. Hence, you should see the same data under both
columns for records that are reciprocal.

Where can I get more information?

Microsoft Platform SDK – ICE15

ICE16

What does ICE16 check?

ICE16 validates that the value of the ProductName property in the Property table
is no greater than 63 characters in length.

Note: The installer truncates ProductName values that are 31 to 63 characters in


length to 31 characters. A longer name does not show when the registry key for
DisplayName is set in the Uninstall for ARP.

When does ICE16 show up?

ICE16 posts an error message if the ProductName set in the Property table is
longer than 63 characters.

How can I fix ICE16?

You need to make your Product Name string less than or equal to 63 characters
in length.

Where can I get more information?

Microsoft Platform SDK – ICE16

ICE17

What does ICE17 check?

ICE17 checks more than one situation related to the user interface controls used
on dialogs (if your setup contains dialogs).
When does ICE17 show up?

ICE17 displays an error or warning message if the following rules are not
followed:

• Pushbutton control used on a dialog must have an event defined in the


Control Event table. Essentially the idea of using a push button is to
trigger an event. A button that is not attached to an event does not provide
any value. ICE17 returns error if this rule is not followed.
• Bitmap and/or icon controls used on dialogs must have corresponding
bitmaps and/or icons listed in the Binary table. Binary table is used to
store binary data such as bitmaps, icons, DLL files, etc. If a bitmap control
or an icon control does not have a corresponding data listed in the Binary
table, ICE17 returns error.
• Property value used in RadioButton table must be used for the
corresponding data under Property column in Control table (if the Indirect
bit is not set in Attributes column). ICE17 posts a warning because the
installer uses the property's value as a foreign key into the RadioButton
table, but the value is missing from the primary key of that table. This
warning can be ignored if the control is created at runtime.
• Property value used in ComboBox table must be used for the
corresponding data under Property column in Control table (if the Indirect
bit is not set in Attributes column). ICE17 posts a warning because the
installer uses the property's value as a foreign key into the ComboBox
table, but the value is missing from the primary key of that table. This
warning can be ignored if the control is created at runtime.
• Property value used in ListView table must be used for the corresponding
data under Property column in Control table (if the Indirect bit is not set in
Attributes column). ICE17 posts a warning because the installer uses the
property's value as a foreign key into the ListView table, but the value is
missing from the primary key of that table. This warning can be ignored if
the control is created at runtime.
• PushButton or CheckBox controls can display a bitmap or an icon. If that
is the case, Text column of the Control table must contain a foreign key
into the record of the Binary table containing the bitmap or icon. ICE17
returns error if this rule is not followed.
• RadioButtonGroup control can display a bitmap or an icon. If that is the
case, Text column of the RadioButton table must contain a foreign key into
the record of the Binary table containing the bitmap or icon. ICE17 returns
error if this rule is not followed.
• PushButton, CheckBox, or RadioButtonGroup controls can not have both
Icon bit and Bitmap bit set in the Attributes column of the Control table. It
is not allowed to set both attributes together. ICE17 returns error if this
rule is not followed.

How can I fix ICE17?


Depending on the situations explained above, the necessary modifications
should be done for the appropriate record(s) of user interface control tables.

Where can I get more information?

Microsoft Platform SDK – ICE17

ICE18

What does ICE18 check?

ICE18 checks if the installation package specifies an empty directory as the key
path of a component that is not listed in the CreateFolder table.

If the KeyPath column of the Component table is Null, this means that directory
listed in the Directory_ column is the key path for that component. Because
folders created by the installer are deleted when they become empty, this folder
must be listed in the CreateFolder table to prevent the installer from attempting to
install every time.

When performing a validation ICE18 first checks whether the following are all
true:

• The KeyPath column of the Component table contains a Null value.


• That there are no files listed for the component in the File table.
• That there are no files for the component listed in the RemoveFile table
and that the value in the DirProperty is the same as the Directory_ column
of the Component table.
• That there are no files for the component listed in the DuplicateFile table
and that the value in the DestFolder is the same as the Directory_ column
of the Component table.
• That there are no files for the component listed in the MoveFile table and
that the value in the DestFolder is the same as the Directory_ column of
the Component table.

If these are all true then ICE18 validates the following:

• That the Component_ column of the CreateFolder table has the same
value as the Component column of the Component table.
• That the Directory_ column of the CreateFolder table has the same value
as the Directory_ column of the Component table.

When does ICE18 show up?

ICE18 posts an error message if the installation package specifies a directory as


the key path for component that is not listed in the CreateFolder table.
How can I fix ICE18?

Empty directory used as a key path for a component in the installation package
must be specified in the CreateFolder table.

Where can I get more information?

Microsoft Platform SDK – ICE18

ICE19

What does ICE19 check?

ICE19 validates that advertised


components reference a file in the
KeyPath column of the Component
table and that an advertised shortcut
references a directory in this column.

ICE19 validates that advertised


components or shortcuts have a
ComponentId. Components in the
PublishComponent table, which are
not advertised in another table, are
only checked to see whether they
have a ComponentId.

When does ICE19 show up?

ICE19 posts an error message if the


KeyPath column of the Component
table does not reference a file in the
case of an advertised component or
a directory in the case of an
advertised shortcut.

ICE19 posts an error message if any


advertised components or shortcuts
do not have a ComponentId.

How can I fix ICE19?

Depending on the situation, either


the KeyPath or ComponentId column
of the Component table has to be
updated.

Where can I get more information?

Microsoft Platform SDK – ICE19

ICE20

What does ICE20 check?

ICE20 validates the standard dialogs (i.e. FilesInUse, Error, Exit, UserExit,
FatalError dialogs) and dialog requirements of an installation package having an
authored user interface. Installation packages with an authored user interface
have a Dialog table and the LIMITUI property is not set.

When does ICE20 show up?

ICE20 posts an error message if it cannot validate that the standard dialogs and
requirements are present in the installation package.

How can I fix ICE20?

If you use commercial MSI setup development tools, standard dialogs should
already be part of a base MSI template. In other words, ICE20 should never
show up if you create packages based on a base MSI template which contains
these standard dialogs.

Where can I get more information?

Microsoft Platform SDK – ICE20

ICE21

What does ICE21 check?

ICE21 validates that every component in the Component table belongs to a


feature. FeatureComponents table is checked to verify this mapping.

When does ICE21 show up?

ICE21 posts an error message if the installation package contains a component


that does not belong to a feature.

How can I fix ICE21?


Every component in an MSI package must be assigned to a feature. If there are
unassigned components, they will never be installed on a target PC. In order to
fix ICE21, the component with this error must be assigned to a proper feature in
the package. This can be accomplished by creating a record in
FeatureComponents table.

Where can I get more information?

Microsoft Platform SDK – ICE21

ICE22

What does ICE22 check?

ICE22 uses the FeatureComponents table to validate the mapping of features


and components referenced in the PublishComponent table (PublishComponent
table is used for qualified components. A qualified component is a method of
single-level indirection, similar to a pointer. Qualified components are primarily
used to group components with parallel functionality into categories.).

When does ICE22 show up?

ICE22 posts an error message if the features and components are mapped
incorrectly in the PublishComponent table.

How can I fix ICE22?

PublishComponent table needs to be modified to have the correct mapping of


features and components referenced in PublishComponent table.

Where can I get more information?

Microsoft Platform SDK – ICE22

ICE23

What does ICE23 check?

ICE23 validates the control tab order for each dialog box. ICE23 verifies that the
tab order forms a single, closed, loop that comes back to the initial control.
Hence, at run-time if you tab from one control to another in the end you should
come back to the control which you started with.

When does ICE23 show up?


ICE23 posts an error message if the tab order of controls does not form a single
closed loop in the dialog box.

How can I fix ICE23?

You will need to create a single, closed loop for the tab order. You may need to
modify the data under Control_First column of dialog record found in Dialog table
or data under Control_next column of control record found in Control table.

Where can I get more information?

Microsoft Platform SDK – ICE23

ICE24

What does ICE24 check?

ICE24 validates the following properties in the Property table:

• That the ProductCode Property is a valid GUID data type. The valid format
for a GUID is {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} where
X is a hex digit (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F).
• That the ProductVersion Property is a valid Version data type. The
Version data type is a text string containing a valid version string. A
version string has the format xxxxx.xxxxx.xxxxx.xxxxx where x is a digit.
The maximum acceptable version string is 65535.65535.65535.65535.
• That the ProductLanguage Property is a valid Language data type. The
Language data type is a text string containing one or more valid numeric
language IDs.

When does ICE24 show up?

ICE24 posts an error message if any of these properties are not in the form of a
valid data type.

How can I fix ICE24?

Property value(s) must be modified to follow the data types allowed.

Where can I get more information?

Microsoft Platform SDK – ICE24

ICE25

What does ICE25 check?


ICE25 validates that a .msi file satisfies all of its internal merge module
dependencies and exclusions.

When does ICE25 show up?

ICE25 posts an error message if .msi file has previously been merged with an
incompatible merge module or if it has not been merged with a necessary merge
module.

How can I fix ICE25?

All merge module dependencies indicated in the .msi file's ModuleDependency


table must be satisfied by at least one merge module listed in the
ModuleSignature table. All excluded merge modules in the ModuleExclusion
table must be compatible with the merge modules listed in the ModuleSignature
table.

Where can I get more information?

Microsoft Platform SDK – ICE25

ICE26

What does ICE26 check?

ICE26 validates that AdminUISequence, AdminExecuteSequence,


InstallUISequence, InstallExecuteSequence tables contain the actions that are
required by the table and does not contain any actions disallowed in the table.

When does ICE26 show up?

ICE26 posts an error message if the installation package has a sequence table
that lacks a required action or that contains an action that is disallowed for the
table.

How can I fix ICE26?

If a required action is missing from the sequence table, you must add the missing
action to the indicated sequence table. If an action cannot be in the indicated
sequence table, you must remove the action from the sequence table.

Where can I get more information?

Microsoft Platform SDK – ICE26

ICE27
What does ICE27 check?

ICE27 validates the sequence tables (i.e., AdvtExecuteSequence,


AdminUISequence, AdminExecuteSequence, InstallUISequence,
InstallExecuteSequence tables) of an installation package for valid actions,
action sequence restrictions, and organization in Search, Costing, Selection, and
Execution sections.

The ICE27 custom action validates the following:

• That the actions listed in the Action column of the sequence tables are
standard actions, a custom action listed in the CustomAction table, or a
dialog box listed in the Dialog table.
• That actions subject to sequencing restrictions are in the correct relative
order to each other in the action sequence. Sequencing restrictions result
when one action is dependent on another.
• That actions restricted to a particular section of the sequence are located
where they belong.

When does ICE27 show up?

ICE27 posts an error message if there are sequence tables in the package with
invalid action sequencing or organization.

How can I fix ICE27?

If there is an unknown action found in a standard table, depending on the action


either a custom action must be added to CustomAction table or a dialog box
must be listed in the Dialog table.

If there is an action that is in wrong place in the sequence table, you must
change the sequence number of the action to place it to the correct location in
the sequence.

If there is an action depends on the execution of another action in the sequence,


one of the two actions must be re-placed in the action sequence by updating the
action sequence number so that the dependent action always gets executed first.

Where can I get more information?

Microsoft Platform SDK – ICE27

ICE28

What does ICE28 check?


ICE28 is commonly used to validate that the ForceReboot action (if used) is
placed before or after, and never within, a specific group of actions in the action
sequence tables (i.e., AdminUISequence, AdminExecuteSequence,
InstallUISequence, InstallExecuteSequence).

When does ICE28 show up?

ICE28 posts an error message if ForceReboot is sequenced within the specified


action group.

How can I fix ICE28?

The ForceReboot action must come between InstallInitialize and InstallFinalize in


the action sequence of the InstallExecuteSequence table.
The following actions commonly occur together as a group in the action
sequence. It is recommended that the ForceReboot action be scheduled to come
after this group. If the ForceReboot action is scheduled before the
RegisterProduct action, the installer again requires the source of the installation
package after the restart. Therefore, the preferred sequence for ForceReboot is
immediately following this action sequence.
RegisterProduct
RegisterUser
PublishProduct
PublishFeatures
CreateShortcuts
RegisterMIMEInfo
RegisterExtensionInfo
RegisterClassInfo
RegisterProgIdInfo

Where can I get more information?

Microsoft Platform SDK – ICE28

ICE29

What does ICE29 check?

MSI file is designed as a Win32 OLE structured storage and handling of streams
by the Win32 OLE structured storage implementation limits stream names. The
installer can compress stream names up to 62 characters in length. Names
longer than this are truncated. ICE29 validates that truncated stream names
remain unique. Any table having a Binary or Object column is validated.

When does ICE29 show up?


ICE29 posts an error if truncated stream names do not remain unique.

How can I fix ICE29?

You must change the truncated stream name to a unique name to fix this error.

Where can I get more information?

Microsoft Platform SDK – ICE29

ICE30

What does ICE30 check?

ICE30 validates that the installation of components containing the same file
never installs the file more than once in the same directory. ICE30 checks both
long file names (LFN) and short file names (SFN).

ICE30 can detect file collisions due to directories with the same property in their
paths, but does not detect collisions resulting from two properties having the
same value due to possible change of a property value at run-time.

When does ICE30 show up?

ICE30 posts an error message for each pair of components that installs the same
file to the same directory.

How can I fix ICE30?

Unless two (or more) components have mutually exclusive conditions, they must
not install the same file to the same location. Doing so will break the component
reference counting system.

In order to fix ICE30, you should either conditionalize both components or make
sure that components install the file to different targets.

Where can I get more information?

Microsoft Platform SDK – ICE30

ICE31

What does ICE31 check?


ICE31 checks if the font styles used in controls on dialogs are defined in MSI. It
also validates that the DefaultUIFont property refers to a valid font style. The
DefaultUIFont property sets the default font style used for controls.

Controls can have a predefined font style. To set the font and font style of a text
string, you need to prefix the string of displayed characters with {\style} or
{&style}. Where style is an identifier listed in the TextStyle column of the
TextStyle table. If neither of these are present, but the DefaultUIFont property is
defined as a valid text style, that font will be used.

ICE31 checks the Text column for each control in the Control Table to verifies
that a valid entry exist in the TextStyle table.

When does ICE31 show up?

ICE31 posts an error message for undefined styles, style names that are too
long, a missing TextStyle table, and style tags with no closing brace.

ICE31 posts a warning if the style tag is not at the beginning of the line, or if a
control has multiple style tags

How can I fix ICE31?

If the error is because of an undefined style, a style record has to be entered in


TextStyle table.

If the error is due to a long style name, you will need to shorten the name so that
it can contain less than 72 characters. A style that is over 72 chars and therefore
cannot possibly be a style even if somehow you did manage to get it in the
TextStyle table.

If the error is because of the missing TextStyle table, it has to be added to the
MSI and then style records have to be added to the table.

If the error is due to a style tag with no closing brace, a closing brace has to be
added to the Text column of the control record in Control table.

If ICE31 posts a warning because of a style tag not at the beginning of the line,
the tag has to be replaced to the beginning of the line under the Text column of
the control record in Control table.

If ICE31 posts a warning due to multiple style tags, only one of the tags have to
be left by removing the others from the Text column of the control record in
Control table.

Where can I get more information?


Microsoft Platform SDK – ICE31

ICE32

What does ICE32 check?

ICE32 validates that keys and foreign keys in the .msi file are of the same size
and column definition types. This ICE custom action makes the comparison using
the _Validation table and using the definition types that are returned by
MsiViewGetColumnInfo.

When does ICE32 show up?

ICE32 posts errors if the .msi file contains any foreign keys to keys of a different
column length or column data type.

How can I fix ICE32?

If the foreign key and key defined differ in size, you should change the data type
length to match.

If there is a foreign key and key defined that differ in their definition types, the
foreign key and key pairs must be defined so that their data types match.

Note: As long as you use a good MSI template to start with and do not manually
add any extra custom tables to the database, you should never see any ICE32
errors.

Where can I get more information?

Microsoft Platform SDK – ICE32

ICE33

What does ICE33 check?

ICE33 validates that the all the entries in the Registry table belong in that table.

Even though Registry table is used to create/edit registry keys on the target
machine, it is not the only table used to do this task. Registry keys that register
Classes, Filename Extensions, ProgIDs, Shell Verbs, Remote Server AppIDs,
MIME types, or Typelibs are considered as special keys because they can be
used as advertised entry points to the application. Maximizing the number of
advertised entry points to the application increases the chances that the
application can trigger self-repair in a situation where the application is expected
to fail. Technically entering these special registry keys to Registry table does not
create any problems as far as the application functionalities and the setup are
concerned. These special keys will still be registered by means of Registry table.
However, Windows Installer service will not consider these keys as advertised
entry points to the application. Hence, they will not be able to trigger self-repair if
needed. Use of Extension, ProgId, Verb, MIME, Class, Typelib and AppId tables
provides the extra benefit by maximizing your potential for self-healing.

The other disadvantage of keeping ICE33 warnings in your MSI package is the
fact that you will not be able to fully advertise your product if you want to utilize
advertising features of Windows Installer. That means, installation-on-demand
will be limited to only advertised shortcuts but not other entry points such as file
extensions or MIME types. That is because advertising simply puts down the
advertised entry points to the target machine and postpones the rest of the
installation to a time that the application is somehow triggered by an advertised
entry point. If Registry table is used to store those entry points such as file
extensions, they will not show up during advertisement. They will only show up
when the application is fully installed.

When does ICE33 show up?

ICE33 issues a warning for each Registry table entry that should be moved and
suggests the appropriate table. ICE33 posts warnings for any entries that register
Classes, Filename Extensions, ProgIDs, Shell Verbs, Remote Server AppIDs,
MIME types, or Typelibs.

How can I fix ICE33?

The fix is to move those special registry entries to the table(s) suggested by the
warning. However, unless you are very familiar with registry as well as the
application, it is not recommended to move them especially in a repackaging
situation. Taking such an action without much familiarity with registry and the
application can cause more problems with your MSI package.

Extensions, ProgIds, Verbs, and MIME types must be registered through their
respective Extension, ProgId, Verb, MIME tables to support advertisement and
install-on-demand. Entries in the Registry table are not written to the registry until
the component controlling the value is installed to run Locally or to Run From
Source. This precludes the advertisement of components registered through the
Registry table. It also precludes install-on-demand for any feature or product
requiring the component because advertisement is the only way install-on-
demand is available through the Windows Shell.

For Windows 2000, COM Classes must be registered through the Class table to
advertise CLSID Contexts and for install-on-demand.
Note that the tables available cannot handle all possible COM registration. In
these cases an author should enter as much information as possible into to the
individual tables and the remaining information into the Registry table. A common
authoring error that must be avoided in this case is that of duplicating an entry in
both a COM table and in the Registry table.

It is easier to manage registry keys if they are listed in the appropriate tables
rather than being mixed together into the Registry tables. The values in the
Typelib and AppId tables are registered when the component controlling the
value is installed to run Locally or From Source. These tables are provided for
the convenience of setup authors.

Where can I get more information?

Microsoft Platform SDK – ICE33

ICE34

What does ICE34 check?

ICE34 validates that each radio


button on every RadioButtonGroup
Control has a property in the
Property column of the RadioButton
table that specifies its radio button
group. ICE34 validates that this
property exists and is set to a default
value in the Property table which is
equal to one of the group's radio
button values in the Value column of
the RadioButton table.

A radio button group must have a


default for users to be able to select
a choice using the TAB key. This is
required for proper user accessibility.
Property used for a
RadioButtonGroup control keeps the
selection made by the user.

ICE34 also reports missing tables.

When does ICE34 show up?

ICE34 post an error message if there


is a radio button that does not have a
property or specifies an invalid
property.

How can I fix ICE34?

To fix the errors reported by this


ICE34, you need to check the
following:

o Every RadioButton
control entry without the
indirect attribute set has a
property listed in the Property
column.
o Every such property
has at least one
corresponding entry in the
RadioButton table.
o Every such property is
defined in the Property table,
with a value that is one of the
choices from the RadioButton
table.
o Every property
referenced in the Property
column of a RadioButton
control with the indirect
attribute set is defined in the
Property table.

Where can I get more information?

Microsoft Platform SDK – ICE34

ICE35

What does ICE35 check?

ICE35 validates that components containing compressed files stored in a cabinet


file are not set to run from source. With Windows Installer 2.0 or later, this
restriction has been removed.

ICE35 queries the Cabinet column of the Media table to determine which files are
compressed and stored in a cabinet file. It queries the File table to determine
which components contain these files. Finally, it checks the Component table to
determine whether the run-from-source bits are set in the Attributes column.

When does ICE35 show up?

ICE35 posts an error message if there is a compressed file stored in a cabinet


file belonging to a component which is set to run from source. With Windows
Installer 2.0 or later, this is changed from an error to a warning message.

ICE35 posts warning message if there is a compressed file stored in a cabinet


file belonging to a component which is set to run locally or from source. This
warning message has been removed with Windows Installer 2.0 and later.

How can I fix ICE35?

To fix this error/warning you must change the bit set in the Attributes column of
the Component table so that it will be set to run locally, or remove the file from
the CAB file.

Where can I get more information?

Microsoft Platform SDK – ICE35

ICE36 What does ICE36 check?

ICE36 checks if the package contains unused icons that reduces the installer
performance. ICE36 validates that every icon in the Icon table is listed at least
once in the ARPPRODUCTICON property or the Class, ProgId, or Shortcut
tables.

During advertisement, the installer installs all the icons listed in the Icon table on
the user's computer. Having unused icons in the Icon table does not prevent the
installation from running, however it does unnecessarily increase the size of
the .msi file and the time and space required to advertise a feature.

When does ICE36 show up?

ICE36 posts a message if there is an icon in the Icon table that is not referenced
in the Class, ProgId, or Shortcut tables and if there is no UI provided to create
such a reference at run time.

How can I fix ICE36?

If an icon is not referenced in the property or table and there is no UI provided to


create a reference at run time, you should remove the icon to achieve better
performance.
Where can I get more information?

Microsoft Platform SDK – ICE36

ICE38

What does ICE38 check?

ICE38 validates that every component being installed under the current user's
profile also specifies a registry key under the HKEY_CURRENT_USER root in
the KeyPath column of the Component table.

In a roaming user profiles scenario where the application is installed for


everyone, windows installer must take care of re-installing the user specific
resources such as HKCU keys for the new user who did not originally install the
application. Since key paths are verified and self healing is initiated (if necessary)
when the application is launched through an advertised entry point, the way to
get the user specific data back for a new user is to make an HKCU key as the
key path of a component that installs the user data.

When does ICE38 show up?

ICE38 posts an error if a component installed under the user's profile does not
specify a HKCU registry key.

How can I fix ICE38?

• If a component with a file key path, installs to user profile, it must use a
registry key under HKCU as its Key Path, not a file. To fix this error on the
component, change the component key path type to registry key path and
set the key path to a HKCU key.
• If a component with a key path value set to NULL, installs to user profile, it
must use a registry key under HKCU as its Key Path, not NULL. To fix this
error on the component, change the component key path type to registry
key path and set the key path to a HKCU key.
• If a component with a registry key path value set to a HKLM registry key,
installs to user profile, it must use a registry key under HKCU as its Key
Path, not a HKLM registry key. To fix this error on the component, set the
key path to a HKCU key.
• If a component with a registry key path value set as NULL, installs to user
profile, it must use a registry key under HKCU as its Key Path, not NULL.
To fix this error on the component, set the key path to a HKCU key.
• If the Registry entry referenced in the KeyPath column of the component
was found and lies under the HKCU tree, but the registry entry's
Component_ column does not refer back to the same component that
listed it as the KeyPath, this means that the registry entry used as the
KeyPath of the component would only be created when some other
component was installed. To fix this error change the KeyPath value to
refer to a registry entry that belongs to the component, or change the
registry entry to belong to the component using it as a KeyPath.

Where can I get more information?

Microsoft Platform SDK – ICE38

ICE39

What does ICE39 check?

ICE39 validates the Summary


Information Stream of the database.

ICE39 checks the format of the Word


Count Summary Property, Page
Count Summary Property, Template
Summary Property, Revision
Number Summary Property, Create
Time/Date Summary Property, Last
Saved Time/Date Summary
Property, and Last Printed Summary
Property.

When does ICE39 show up?

If the Word Count Summary Property


specifies that the source is
compressed, ICE39 posts a warning
if any files are also marked as
compressed in the Attributes column
of the File table.

ICE39 also posts a warning if the


properties specified above do not
follow the format specified in
Windows Installer SDK.

How can I fix ICE39?

If the warning is due to a data format


problem, check the specific property
explanation and update the value
entered as a value based on the
property value format.

Where can I get more information?

Microsoft Platform SDK – ICE39

ICE40

What does ICE40 check?

ICE40 does the following miscellaneous validation:

• ICE40 checks if the .msi file is missing the Error table and the Page Count
Summary Property is less than or equal to 100. This means that the
installer is only capable of displaying numeric error codes to the user at
run time. The Error table is only required in packages having a schema
that is less than or equal to 100. Windows Installer versions 1.1 and later
do not require the package to have an Error table because the error
messages can also be retrieved using Msimsg.dll. Packages with a
schema greater than 100 cannot be installed by Windows Installer version
1.0.
• ICE40 checks if the REINSTALLMODE property has been overridden.
• ICE40 also checks if the RemoveIniFile table has a Delete Tag entry with
no value.

When does ICE40 show up?

• ICE40 posts an error if the .msi file is missing the Error table and the Page
Count Summary Property is less than or equal to 100.
• ICE40 posts an error if REINSTALLMODE property is defined in the
Property table.
• ICE40 posts an error if there is a Delete Tag action in the in the
RemoveIniFile column of the RemoveIniFile table without specifying a tag
to delete in the Value column.

How can I fix ICE40?

• If the .msi file is missing the Error table and the Page Count Summary
Property is less than or equal to 100, add an Error table to the installation
package and author formatting templates in the Message column for error
messages.
• If REINSTALLMODE property is defined in the Property table, remove it
from the Property table. Defining the REINSTALLMODE property in .msi
file can lead to unexpected behavior.
• If there is a Delete Tag action in the in the RemoveIniFile column of the
RemoveIniFile table without specifying a tag to delete in the Value column,
add a tag to delete in the Value column of RemoveIniFile table for that
specific record.

Where can I get more information?

Microsoft Platform SDK – ICE40

ICE41

What does ICE41 check?

ICE41 checks if the package contains any feature that does not contain the
component implementing the class object or extension. If the package contains
such a feature, the installer does not install the component with the feature and
that advertising may not work as expected.

ICE41 validates that the entries in the Class and Extension tables refer to entries
in the Component table that implement the class object or extension of the
component.

When does ICE41 show up?

ICE41 posts an error if there is a feature that does not contain the component
implementing the class object or extension.

How can I fix ICE41?

• If the error is due to an extension, change the entry in the Feature_


column of the Extension table entry to reference a feature that installs the
component listed in the Component_ column or change the feature and
component associated in the FeatureComponents table.
• If the error is because of a class entry, change the entry in the Feature_
column of the Class table entry to reference a feature that installs
component listed in the Component_ column or change the feature and
component associated in the FeatureComponents table.

Where can I get more information?

Microsoft Platform SDK – ICE41

ICE42

What does ICE42 check?


ICE42 validates that InProc servers are not linked to EXE files in the Class table.
EXE files cannot be InProc servers.

ICE42 also validates that only LocalServer and LocalServer32 classes have
arguments and DefInProc values.

When does ICE42 show up?

ICE42 posts an error if there are InProc servers linked to EXE files in the Class
table.

How can I fix ICE42?

• If CLSID specified in the Class table is an InProc server, but the


implementing component has an EXE as its key path, change the key path
file.
• If Context column of the Class table for a CLSID record is set to
'InProcServer32' and the record has an argument under Argument
column, remove the argument. Only LocalServer contexts can have
arguments.
• If CLSID in context 'InProcServer32' species a default InProc value,
remove the DeflnProc value or change the context of the class. Only
LocalServer contexts can have default InProc values.

Where can I get more information?

Microsoft Platform SDK – ICE42

ICE43

What does ICE43 check?

ICE43 validates that shortcuts that do not reference a feature as their Target
(non-advertised shortcuts) are in components having a HKCU registry entry as
their key path.

Leaving ICE43 errors in the package causes non-advertised shortcuts in the


problem component to be installed for the first user on the computer ONLY.
Users who install the component later do not see the shortcuts because the
component appears to the installer as already existing on the computer.

When does ICE43 show up?

ICE43 posts an error message if a non-advertised shortcut is in a component that


does not have a HKCU registry entry as its key path.
How can I fix ICE43?

• If a component has non-advertised shortcuts, and its key path is set to a


file, reset the key path with a registry key under HKCU.
• If a component has non-advertised shortcuts, and its key path is set to
NULL, reset the key path with a registry key under HKCU.
• If a component has non-advertised shortcuts, and its key path is set to a
registry key other than keys under HKCU, reset the key path with a
registry key under HKCU.
• If a component has non-advertised shortcuts, and its key path is set to a
registry key under HKCU but not listed in the Registry table, create the
entry in the Registry table.
• If a registry entry is set as the key path for a component, but that registry
entry doesn't belong to the same component, the registry entry used as
the key path of the component is only created if some other component
was installed. To fix this error, change the key path value to refer to a
registry entry that belongs to the component or change the registry entry
to belong to the component using it as a key path.

Where can I get more information?

Microsoft Platform SDK – ICE43

ICE44

What does ICE44 check?

ICE44 validates that the NewDialog, SpawnDialog, and SpawnWaitDialog


ControlEvents reference valid dialog boxes in the Dialog table.

When does ICE44 show up?

ICE44 posts an error message if there is a dialog control event that does not
reference a dialog box listed in the Dialog table.

How can I fix ICE44?

If the control event for a control on a dialog is set to NewDialog, or SpawnDialog,


or SpawnWaitDialog, the argument must be set to a valid dialog box in the Dialog
table.

To fix ICE44, add an argument that is a key in the Dialog Table.

Where can I get more information?

Microsoft Platform SDK – ICE44


ICE45

What does ICE45 check?

ICE45 validates that bit field columns in the database do not set any reserved
bits to 1.

Reserved bits provide no functionality in current versions of the installer, but


might in future versions. They should be set to 0 to be compatible with future
versions of Windows Installer.

When does ICE45 show up?

ICE45 posts an error message if any of the following tables contains a bit field
with a reserved bit set to a value of 1.

• BBControl table
• Dialog table
• Feature table
• File table
• MoveFile table
• ModuleConfiguration table
• ODBCDataSource table
• Patch table
• RemoveFile table
• ServiceControl table
• ServiceInstall table
• TextStyle table

ICE45 posts one of two warning messages if the Control Table contains a bit field
with a reserved bit set to a value of 1.

How can I fix ICE45?

To avoid ICE45, do not set any reserved bits to 1 for bit field columns in the
database.

Where can I get more information?

Microsoft Platform SDK – ICE45

ICE46

What does ICE46 check?


ICE46 checks for custom properties in conditions, formatted text, and other
locations that differ from a system defined property only by the case of one or
more characters.

Note: Property names are case sensitive.

When does ICE46 show up?

ICE46 posts an informational message if there is a custom property in a


condition, formatted text, and other location that differs from a system defined
properties only in the case of one or more characters.

How can I fix ICE46?

If you receive ICE46, verify that those two properties mentioned in the
informational message are NOT the same. Since properties are case sensitive, a
property name with lower case characters is different than the same property
name with upper case characters (even if the difference is only one character
being upper case or lower case).

Where can I get more information?

Microsoft Platform SDK – ICE46

ICE47

What does ICE47 check?

ICE47 checks the Feature and FeatureComponents tables for features with 1600
or more components.

When does ICE47 show up?

ICE47 posts an error message if a feature exceeds the maximum limit of 1600
components per feature on Windows NT, Windows 2000, Windows XP and 800
components per feature on Windows 95, Windows 98, Windows Millennium
Edition (Windows Me).

How can I fix ICE47?

To fix this warning, try splitting the feature into several features.

Where can I get more information?

Microsoft Platform SDK – ICE47


ICE48

What does ICE48 check?

ICE48 checks for directories that are hard-coded to local paths in the Property
table.

When does ICE48 show up?

ICE48 posts an error message if there is a directory that is hard-coded to a local


path in the Property table.

How can I fix ICE48?

Do NOT hard-code directory paths to local drives because computers differ in the
setup of the local drive. This practice may be acceptable if deploying an
application to a large number of computers on which the relevant portions of the
drives are all the same.

Where can I get more information?

Microsoft Platform SDK – ICE48

ICE49

What does ICE49 check?

ICE49 checks for default registry entries that are not a REG_SZ type.

When does ICE49 show up?

ICE49 posts an error if there is a default registry entry that is not a REG_SZ type.

On Windows 95 computers, default registry entries (those with no name) can


only be REG_SZ values. On Windows 98 and Windows NT/Windows 2000
systems, default values can be of any type. Components with non-REG_SZ
default values are valid, as long as they are never installed on a Win95
computer. If they are, an error is generated at install time.

How can I fix ICE49?

To fix this error, make installation of the component conditional upon the target
not being a Windows 95 computer, or change the value to type REG_SZ.
Where can I get more information?

Microsoft Platform SDK – ICE49

ICE50

What does ICE50 check?

ICE50 checks that shortcut icons are specified to display correctly and match
their target file's extension.

When does ICE50 show up?

ICE50 posts an error message if the extension of the icon and target files do not
match. ICE50 posts a warning if icons are stored in files that do not have an .exe
or .ico extension.

How can I fix ICE50?

• If the extensions of the icon and the target file do not match, the shortcut
will not have the correct context menu when the component is advertised.
To fix this error, rename the icon to match the extension of the target file.
• Some versions of the shell incorrectly display icons stored in files that do
not have extensions of "exe" or "ico". To fix this warning, rename the icon
have an extension of "exe" or "ico".

Where can I get more information?

Microsoft Platform SDK – ICE50

ICE51

What does ICE51 check?

ICE51 checks for TTC/TTF fonts that have titles and other fonts that are missing
titles.

When does ICE51 show up?

ICE51 posts an error or warning if there are any TTC/TTF fonts with titles or
other fonts missing titles.

How can I fix ICE51?

You must specify a title for fonts that do not have embedded names.
TTF/TTC fonts have the title of the font embedded in the file itself. Do not specify
a title for these fonts because the font is then registered twice, once under the
supplied name and again under the embedded name.

Where can I get more information?

Microsoft Platform SDK – ICE51

ICE52

What does ICE52 check?

ICE52 checks for private properties in the AppSearch table.

The AppSearch table contains properties needed to search for a file having a
particular file signature. The AppSearch table can also be used to set a property
to the existing value of a registry or .ini file entry.

When using Windows 2000 all properties set in the Property column of the
AppSearch table must be public properties.

Note: Private property names must include lowercase letters. However, public
property names cannot contain lowercase letters.

When does ICE52 show up?

ICE52 posts a warning if there is a private property in the AppSearch table.

How can I fix ICE52?

To fix this warning change the private property found in the AppSearch table to a
custom public property.

Where can I get more information?

Microsoft Platform SDK – ICE52

ICE53

What does ICE53 check?

ICE53 checks for entries in the Registry table that write private installer
information or policy values to the system registry.

When does ICE53 show up?


ICE53 posts a warning if the Registry table specifies writing internal or policy
information to the registry.

How can I fix ICE53?

The package should not specify any system policy value in the registry. System
policies should be configured without an installer package.

Note: Windows Installer specific system policy values can be found under
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer

Where can I get more information?

Microsoft Platform SDK – ICE53

ICE54

What does ICE54 check?

ICE54 checks for components that use a companion file as their key path.

When does ICE54 show up?

ICE54 posts a warning if any component has a key path file that derives its
version from another file.

How can I fix ICE54?

The key path file of a component must not derive its version from a different file.
This can cause some files to fail to install. To fix this warning, change the key
path of the component to another file whose version is not derived from a
different file and found in the same component.

Note: For companion files, the Version field of the File table can be set to contain
the primary key of another record in the File table. The referenced file then
determines the versioning logic for this file.

Where can I get more information?

Microsoft Platform SDK – ICE54

ICE55

What does ICE55 check?


ICE55 validates that all LockPermission objects exist and have valid permission
values.

Note: The LockPermissions table is used to secure individual portions of your


application in a locked-down environment. It can be used to set permissions on
installation of files, registry keys, and created folders for specific users/groups.

When does ICE55 show up?

ICE55 post an error if a LockObject listed in the LockPermissions table does not
exist or if no privilege level is specified in the Permission column.

How can I fix ICE55?

• If there is an object record in the LockPermission without a permission


value, specify a numeric value in Permission column. If no privileges are
needed for this object then you should remove the row.
• If an object described in the LockPermissions table is not listed in the
appropriate table (i.e., File, Registry, CreateFolder), refer to a valid object.

Where can I get more information?

Microsoft Platform SDK – ICE55

ICE56

What does ICE56 check?

ICE56 validates that the directory structure of the .msi file has a single root
directory, that the root is the TARGETDIR property, and that the SourceDir
property value is in the DefaultDir column of the Directory table.

If a .msi file has multiple roots or specifies a root other than TARGETDIR, an
administrative installation does not create a correct administrative image.

Note: Empty directories are not checked by ICE56. The directory structure
passes validation with multiple root directories if the extra directories are empty.

When does ICE56 show up?

ICE56 posts an error if the .msi does not have a single root, TARGETDIR, or if
SourceDir is not specified in the DefaultDir column of the Directory table.

How can I fix ICE56?


• If directory TARGETDIR has a bad DefaultDir value, change the
DefaultDir value to “SourceDir” or “SOURCEDIR”. It may be possible to
make TARGETDIR the parent of the second root, and use the '.' value in
the DefaultDir column.
• If there is a root directory other than TARGETDIR set to “SourceDir” or
“SOURCEDIR”, remove the second root directory. The Directory structure
should have only one root called TARGETDIR.

Where can I get more information?

Microsoft Platform SDK – ICE56

ICE57

What does ICE57 check?

ICE57 validates that individual components do not mix per-machine and per-user
data. This ICE custom action checks registry entries, files, directory key paths,
and non-advertised shortcuts.

Mixing per-user and per-machine data in the same component could result in
only partial installation of the component for some users in a multi-user
environment. For example, after the installation for everyone on the same
machine, a new user may not be able to get per-user data due to the poor design
of components. This can lead to application run-time problems.

When does ICE57 show up?

ICE57 posts an error if it finds any component that contains both a per-machine
and per-user registry entries, files, directory key paths, or non-advertised
shortcuts.

How can I fix ICE57?

To fix ICE57 errors, reorganize the application such that each component
contains only per-user or per-machine resources, and not both.

Where can I get more information?

Microsoft Platform SDK – ICE57

ICE58

What does ICE58 check?

ICE58 checks that your Media table does not have more than 80 rows.
When does ICE58 show up?

ICE58 posts a warning if the package contains more than 80 rows in the Media
table and the package's Page Count Summary Property is less than 150.

Warnings reported by ICE58 cause the installation to FAIL unless the package is
installed with Windows Installer version 2.0 or later. Beginning with Windows
Installer version 2.0, the restriction to more than 80 media table entries is
removed. No warning is issued if the package's Page Count Summary Property
is greater than or equal to 150. Packages of schema 200 or higher can only be
installed by Windows Installer version 2.0 or later.

How can I fix ICE58?

To fix this error, eliminate any unused media table entries, consolidate media
table entries that refer to the same media, and repackage your application to
reduce the media required.

Note: If the target machines are known to have Windows Installer version 2.0 or
later, ICE58 can be safely ignored.

Where can I get more information?

Microsoft Platform SDK – ICE58

ICE59

What does ICE59 check?

ICE59 checks that advertised shortcuts belong to components that are installed
by the target feature of the shortcut.

Target of an advertised shortcut must point to a valid feature and the component
it refers to must be part of the target feature.

Errors reported by ICE59 generally lead to the following behavior:

The advertised shortcut will launch the Windows Installer to install the feature
listed in the Target column. But because the FeatureComponents table does not
map the target feature to the component containing the shortcut, the keyfile of
the component (which is activated by the shortcut) is not installed. Therefore the
shortcut is broken and will not do anything.

When does ICE59 show up?


ICE59 posts an error if an advertised shortcut does not belong to the
components that are installed by the target feature of the shortcut.

How can I fix ICE59?

If there is no mapping between the target feature of an advertised shortcut and


the component it refers to (in the FeatureComponents table), add a row to the
FeatureComponents table so that target feature of the advertised shortcut is
associated with the component that advertised shortcut belongs.

Where can I get more information?

Microsoft Platform SDK – ICE59

ICE60

What does ICE60 check?

ICE60 checks that files in the File table meet the following condition:

• If the file is not a font and has a version, then it must have a language.
• ICE60 checks that no versioned files are listed in the MsiFileHash table.

Failure to fix a warning reported by ICE60 generally leads to a file being


needlessly reinstalled when a product repair is done. This happens because the
file to be installed in the repair and the existing file on disk have the same version
(they are the same file) but different languages. The file table lists the language
as null, but the file itself has a language value in the resource. Based on the file
versioning rules, the installer favors the file to be installed, so it is recopied
needlessly.

When does ICE60 show up?

• ICE60 posts a warning or an error if a file in the File table that is not a font
and has a version, does not have a language.
• ICE60 posts an error if a file listed in the MsiFileHash table is versioned.

How can I fix ICE60?

• If ICE60 shows up due to a missing language code, add a language to the


file in the File table. Files should have language values stored in the
version resource whenever possible. If a file is language neutral, use the
LANGID 0.
• If a versioned file is listed in the MsiFileHash table, remove the record
from the table.
Where can I get more information?

Microsoft Platform SDK – ICE60

ICE61

What does ICE61 check?

ICE61 checks the upgrade table to ensure that the following conditions are true:

• All ActionProperty properties are not pre-authored in the Property table.


• All ActionProperty properties are Public Properties.
• All ActionProperty properties are included in the SecureCustomProperties
property (i.e., they are restricted public properties).
• All ActionProperty properties are unique to each record in the Upgrade
table.
• All VersionMax values are not less than the corresponding VersionMin
values.
• No attempt is made to remove a newer or equal version of the current
product.

Failure to fix a warning or error reported by ICE61 generally leads to problems in


upgrading your application. Depending on the exact error, this could be anything
from leaving files from the older version behind, deleting files from the older
version even though they are needed by the new application, or complete failure
of the upgrade.

When does ICE61 show up?

ICE61 posts a warning or error if any of the above conditions are not true.

How can I fix ICE61?

• If the VersionMax value in the Upgrade table is NOT less than the product
version in the Property table (i.e., ProductVersion), the installer will try to
remove the product of the same version or higher. To fix this error, use a
version in the VersionMax column lower than the current version specified
in the Property table. Remove the “Include maximum version” option if
Maximum Version is equal to the current version. If the intent is only to
detect the product and not remove it, specifying “Detect Only” will also fix
this error.
• If the ActionProperty is not listed in the SecureCustomProperties property,
the property is not passed to the server side of the install when the
property is found. To fix this error, add the property to
SecureCustomProperties (i.e., make it a restricted public property).
• If the ActionProperty contains lowercase letters, edit the property name to
have all uppercase letters. Upgrade properties must be public properties
for the result to be passed to the server side of the installation.
• If the same ActionProperty is used for more than one record of the
Upgrade table, use a different property for the second record. A property
can only be used in one row of the Upgrade table.
• If Upgrade.VersionMax is less than Upgrade.VersionMin, update the
VersionMax value to be higher than VersionMin. The minimum version
must be less than the maximum version.

Where can I get more information?

Microsoft Platform SDK – ICE61

ICE62

What does ICE62 check?

ICE62 performs extensive checks on the IsolatedComponent table for data that
may cause unexpected behavior.

IsolatedComponents table is used to specify that the installer copy the shared
files (commonly shared DLLs) of an application into that application's folder
rather than to a shared location. This private set of files (DLLs) are then used
only by the application. Isolating the application together with its shared
components in this manner has the following advantages:

• The application always uses the versions of the shared files with which it
was deployed.
• Installing the application does not overwrite other versions of the shared
files by other applications.
• Subsequent installations of other applications using different versions of
the shared files cannot overwrite the files used by this application.

Failure to fix an error reported by ICE62 can result in a failure of the isolated
component system in a wide variety of ways. For example, if the shared DLL
reference counter is not incremented for a shared component, the registration for
the component could be removed when another application uses that
ComponentId and is uninstalled.

When does ICE62 show up?

ICE62 posts a warning or error when it finds data in the IsolatedComponent table
that may produce unexpected behavior.

How can I fix ICE62?


• If an isolated application component does not have a file key path, use a
different component as the application for the isolated component. An
isolated application component must provide a valid executable path to
use to isolate the component.
• If an isolated shared component is not set to increment shared DLL
reference counter, update the component to increment the shared DLL
counter. Not solving this problem can result in the lifetime of the
component being incorrect. If another application uses this component
(isolated or not) and is uninstalled, the registration for the component is
removed but this application's isolated copy remains. This causes repair
and uninstall problems.
• If an isolated shared component contains a condition that may be
evaluated too FALSE during the lifetime of an installation on a computer,
the isolated component could be orphaned without registration
information. To fix this warning, remove the condition, or author the
condition so that it can never change from TRUE to FALSE.
• If an isolated shared component is shared by two or more components
that belong to different features and are installed to the same directory,
install the components to different directories or check whether some of
the components truly require an isolated component.
• If a feature containing one of the application components is removed the
shared component is removed as well. This causes the other feature
having application components to lose the isolated component.

Where can I get more information?

Microsoft Platform SDK – ICE62

ICE63

What does ICE63 check?

ICE63 checks for proper sequencing of the RemoveExistingProducts action.

Note: The RemoveExistingProducts action goes through the product codes listed
in the Upgrade column of the Upgrade table and removes the products in
sequence by invoking nested installations. For each nested installation the
installer sets the ProductCode property to the product code and sets the
REMOVE property to the value in the Remove field of the Upgrade table. If the
Remove field is blank, its value defaults to ALL and the installer removes the
entire product.

The RemoveExistingProducts action has sequence restrictions and may be


placed:

• Between InstallValidate and InstallInitialize


• Immediately after InstallInitialize, or after InstallInitialize if the actions
between InstallInitialize and RemoveExistingProducts do not generate any
script actions.
• Immediately after InstallExecute or InstallExecuteAgain and before
InstallFinalize (the same restriction as above applies).
• After InstallFinalize.

Failure to fix a warning or error reported by ICE63 leads to failure of the upgrade.

When does ICE63 show up?

ICE63 posts a warning or error if the sequencing of the RemoveExistingProducts


action is not correct.

How can I fix ICE63?

To fix ICE63, verify resequence the actions based on sequence restrictions of


RemoveExistingProducts action.

Where can I get more information?

Microsoft Platform SDK – ICE63

ICE64

What does ICE64 check?

ICE64 checks that new directories in the user profile are removed correctly in
roaming scenarios.

Failure to fix a warning or error reported by ICE64 generally leads to problems in


completely cleaning the computer during an uninstallation. When a roaming user
who has installed the application logs on to a computer for the first time, all of the
profile is copied down onto the computer. On advertisement (which takes place
after the roaming profile download), the Installer verifies that the directory is
already there and therefore does not delete it on uninstallation. This leaves the
directory on the user's computer permanently.

When does ICE64 show up?

ICE64 posts a warning or an error in a roaming situation if a new directory in the


user profile that should be removed is not removed.

How can I fix ICE64?


To fix ICE64, you must explicitly specify installer to remove the directory in the
user profile folder by creating a row for the folder in the RemoveFile table.

Note: ICE64 can be a problem only if advertisement is used. If the application is


not going to be advertised but fully installed by Windows Installer, it can be
ignored.

Where can I get more information?

Microsoft Platform SDK – ICE64

ICE65

What does ICE65 check?

ICE65 checks that the Environment table does not have invalid prefix or append
values.

Note: The Environment table is used to set the values of environment variables.
Failure to fix a warning or error reported by ICE65 generally leads to problems in
install, uninstall, or repair of the environment variable. For example, only some
values of a particular variable may be removed if one or more of the values for
that variable have a trailing separator.

The following is the list of valid prefixes for environment variable names:

• “=” Create the environment variable if it does not exist, and then set it
during installation. If the environment variable exists, set it during the
installation.
• “+” Create the environment variable if it does not exist, then set it during
installation. This has no effect on the value of the environment variable if it
already exists.
• “-“ Remove the environment variable when the component is removed.
This symbol can be combined with any prefix.
• “!” Remove the environment variable during an installation. The installer
only removes an environment variable during an installation if the name
and value of the variable match the entries in the Name and Value fields
of the Environment table. If you want to remove an environment variable,
regardless of its value, use the '!' syntax, and leave the Value field empty.
• “*” This prefix is used with Microsoft Windows NT/Windows 2000 to
indicate that the name refers to a system environment variable. If no
asterisk is present, the installer writes the variable to the user's
environment. Microsoft Windows 95/98 ignores the asterisk and add the
environment variable to autoexec.bat. This symbol can be combined with
any prefix. A package that is used for per-machine installations should
write environment variables to the machine's environment by including * in
the Name column. For more information, see Remarks.
• “=-“ The environment variable is set on install and removed on uninstall.
This is the usual behavior.
• “!-“ Removes an environment variable during an install or uninstall.

Value column in the Environment table is used to append values to existing


environment variables if necessary.

• To append a value to the end of an existing variable, prefix the string in


this field by the Null character [~] and the separator character. For
example, if the semicolon is the chosen separator: [~];Value.
• To prefix a value to the front of an existing variable, append the string in
this field by the separator character and the Null character [~]. For
example, if the semicolon is the chosen separator: Value;[~] .
• If no [~] is present in the field, the string represents the entire value to be
set or deleted.
• Each row can contain only one value. For example, the entry Value;Value;
[~] is more than one value and should not be used because it causes
unpredictable results. The entry Value;[~] is just one value.
• If Name is prefixed with +, then [~] must not be used in Value column. This
is because the meaning of "+" and "[~]" are clearly exclusive of one
another.

When does ICE65 show up?

ICE65 posts a warning or an error if the environment table has invalid prefix or
append values.

How can I fix ICE65?

To fix ICE65, use valid prefix and/or append values based on Environment table
guidelines mentioned above.

Where can I get more information?

Microsoft Platform SDK – ICE65

ICE66

What does ICE66 check?

ICE66 uses the tables in the database to determine which schema your database
should use.

When does ICE66 show up?


ICE66 posts a warning if your database is using the wrong schema.

How can I fix ICE66?

Some functionalities of installer package may only be available if the package is


installed on a system with a specific version of Windows Installer. If you would
like to make your package compatible with older versions of Windows Installer,
you must make sure that the new functionalities provided only in the later
versions of installer are not used in your package. Otherwise, you may miss
some functionality of your package that are executed on windows platforms with
older versions of Windows Installer. Set your Page Count Summary property
accordingly.

Where can I get more information?

Microsoft Platform SDK – ICE66

ICE67

What does ICE67 check?

ICE67 checks that the target of a non-advertised shortcut belongs to the same
component as the shortcut itself, or that the attributes of the target component
ensure that it does not change installation locations.

Failure to fix a warning or error reported by ICE67 can cause the shortcut to be
invalid if the target component changes state and the source component does
not. For example, when the target file's component is set to run from source, a
reinstallation that changes the component to local results in the component
containing the shortcut not being reinstalled. Thus the shortcut points to an
invalid location.

When does ICE67 show up?

ICE67 returns an error or a warning if the target of a non-advertised shortcut


does not belong to the same component as the shortcut itself, or if the attributes
of the target component do not ensure that the installation locations will not
change.

How can I fix ICE67?

To fix ICE67, install the non-advertised shortcut as part of the component


containing the target file or mark the component with the target file to be installed
locally only or run-from-source only but NOT optional.

Where can I get more information?


Microsoft Platform SDK – ICE67

ICE68

What does ICE68 check?

ICE68 checks that all custom action types needed for an installation are valid.

Failure to fix the error reported by ICE68 causes an installation that attempts to
execute the action to fail.

ICE68 issues a warning if the action is set to run in system context without
specifying it as a deferred execution custom action.

When does ICE68 show up?

ICE68 returns an error if an action type needed for an installation is invalid.

How can I fix ICE68?

• If ICE68 shows up due to a custom action marked to run with elevated


privileges but not specified as deferred, you must set the action to be
deferred. Otherwise, the custom action will execute under user context.
• If ICE68 shows up because of an invalid custom action type, choose a
valid custom action type for the action.

Where can I get more information?

Microsoft Platform SDK – ICE68

ICE69

What does ICE69 check?

ICE69 checks that all substrings of the form [$componentkey] within a


formatted string do not cross-reference components. A cross-component
reference occurs when the [$componentkey] property of a formatted string refers
to a component other than the component stored in the Component_ column of
your tables.

Note: If a substring of the form [$componentkey] within a formatted string is


found, it is replaced by the install directory of the component. If a component
cross-references to another and both components do not belong to the same
feature or contain different conditions, it is possible that they may not be installed
at the same time causing such a substring above to be evaluated to NULL value.
Such missing information may lead to application run-time problems.
When does ICE69 show up?

• ICE69 returns an error if a [$componentkey] substring within a formatted


string cross-references a component in another feature.
• ICE69 returns a warning if a [$componentkey] substring within a formatted
string cross-references a component in the same feature. (The
FeatureComponents table is used to determine this mapping. It must map
to the same feature for the warning. Referencing components in parent
features or referencing components in child features is considered to be
an error.)
• ICE69 reports an error if the [#FileKey] substring within a formatted string
references a file that is not present in the File table.

How can I fix ICE69?

To fix this error, do not cross-reference components. You must change the
[$componentkey] to match its own component instead of another component.

Where can I get more information?

Microsoft Platform SDK – ICE69

ICE70

What does ICE70 check?

ICE70 verifies that integer values for registry entries are specified correctly.
Values of the form ##str, #%unexpanded str are not validated. Values of the form
#xhex, #Xhex, #integer, and #[property] are validated. ICE70 checks for valid hex
characters (0-9,a-f,A-F). and for valid numeric characters (0-9).

When does ICE70 show up?

ICE70 reports an error if integer and/or hex values for registry entries are not
specified correctly.

How can I fix ICE70?

To fix ICE70, use valid values for numeric and/or hex values for registry entries.

Where can I get more information?

Microsoft Platform SDK – ICE70

ICE71
What does ICE71 check?

ICE71 verifies that the Media table contains an entry with DiskId equal to 1.
(Windows Installer assumes that the .msi package is on disk 1.)

When does ICE71 show up?

ICE71 returns an error if the Media table does not contain an entry with DiskId
equal to 1.

How can I fix ICE71?

To fix this error, change the DiskId of the entry where the package is stored to 1.

Where can I get more information?

Microsoft Platform SDK – ICE71

ICE72

What does ICE72 check?

ICE72 verifies that non-built-in custom actions are not used in the
AdvtExecuteSequence table. Specifically, only type 19 (i.e., Cancel Installation),
type 35 (i.e., Set Directory), and type 51 (i.e., Set Property) custom actions are
allowed in the AdvtExecuteSequence table. If other custom actions are used,
advertisement may not behave as expected.

Note: AdvtExecuteSequence is used when application is advertised.

When does ICE72 show up?

ICE72 returns an error if the AdvExecuteSequence table uses custom actions


other than type 35, type 51, and type 19.

How can I fix ICE72?

To fix the error, remove custom actions other than type 35, type 51, and type 19
from the AdvtExecuteSequence table.

Where can I get more information?

Microsoft Platform SDK – ICE72

ICE73
What does ICE73 check?

ICE73 verifies that your package does not reuse package codes, upgrade codes,
or product codes of the Windows Installer SDK samples. Packages should never
reuse the package, upgrade, or product codes of another product.

When does ICE73 show up?

ICE73 outputs a warning if your product's package reuses a package or product


code of a Windows Installer SDK sample.

How can I fix ICE73?

To fix ICE73 errors, generate a new unique GUID for your package's product,
package and upgrade codes.

Where can I get more information?

Microsoft Platform SDK – ICE73

ICE74

What does ICE74 check?

ICE74 verifies that the FASTOEM property has not been authored into the
Property table.

The FASTOEM property enables OEMs to reduce the time required to install
Windows Installer applications for the first time. It cannot be used after the first
install. The FASTOEM property must not be authored in the Property table
because this interferes with subsequent installations for the maintenance,
removal, or repair of the application.

ICE74 also verifies that the UpgradeCode property is authored into the Property
table, and that its value is not a null GUID, {00000000-0000-0000-0000-
000000000000}.

When does ICE74 show up?

• ICE74 posts error if the FASTOEM property has been set in the Property
table.
• ICE74 also posts error if UpgradeCode is not found in the Property table
or set to a NULL GUID.

How can I fix ICE74?


• If FASTOEM property is found in the Property table and you did not
intentionally put it there, remove it from the Property table.
• If UpgradeCode is not found in the Property table, specify an
UpgradeCode for the application.

Where can I get more information?

Microsoft Platform SDK – ICE74

ICE75

What does ICE75 check?

ICE75 verifies that all Custom Action Type 17 (DLL), Custom Action Type 18
(EXE), Custom Action type 21 (JScript), and Custom Action Type 22 (VBScript)
custom actions are sequenced after the CostFinalize action. These types of
custom action use an installed file as their source. ICE75 checks the
InstallUISequence Table, InstallExecuteSequence Table, AdminUISequence
Table, and AdminExecuteSequence Table.

Note: CostFinalize action is required in InstallUISequence,


InstallExecuteSequence, AdminUISequence, and AdminExecuteSequence
tables.

This ICE75 custom action is only available for Windows Installer version 2.0 or
later.

When does ICE75 show up?

ICE75 posts an error if it finds a custom action using an installed file as a source
file that is not sequenced after the CostFinalize action.

How can I fix ICE75?

To fix ICE75 errors, sequence the custom actions after the CostFinalize action.

Where can I get more information?

Microsoft Platform SDK – ICE75

ICE76

What does ICE76 check?

ICE76 verifies the use of the SFP (i.e., System File Protection or WFP - Windows
File Protection) catalog within Windows Installer packages for Windows Me.
ICE76 also verifies that no files in the BindImage table reference SFP catalogs.

Note: The BindImage table contains information about each executable or DLL
that needs to be bound to the DLLs imported by it.

Windows File Protection requires an exact match between the file and the
signature embedded in the catalog file. Files that reference a SFP catalog must
not be listed in the BindImage table because the effect of the BindImage action
on these files differs between computers. Files referenced by SFP catalogs must
be in components that are permanent or installed locally.

When does ICE76 show up?

ICE76 posts an error for each file in the BindImage table that is also in the
FileSFPCatalog table.

ICE76 outputs an error if a file in the FileSFPCatalog table belongs to a


component with any of the following true:

• Component is set to be removed during uninstall (i.e., component is not


permanent).
• Component is set to run from source.
• Component is et to run locally or from source.

How can I fix ICE76?

If a file references a SFP catalog, it can not be in the BindImage table. To fix
ICE76, do not enter any files that reference SFP catalogs into the BindImage
table.

Where can I get more information?

Microsoft Platform SDK – ICE76

ICE77

What does ICE77 check?

ICE77 verifies that deferred custom actions are sequenced after the
InstallInitialize action and before the InstallFinalize action. ICE77 checks the
sequence in the InstallExecuteSequence table and AdminExecuteSequence
table.

When does ICE77 show up?


• ICE77 posts an error if an in-script custom action is sequenced before the
InstallInitialize action or after the InstallFinalize action.
• ICE77 posts an error if the InstallInitialize action or the InstallFinalize
action is missing.

How can I fix ICE77?

To fix ICE77 errors, sequence the in-script (deferred) custom actions after the
InstallInitialize action and before the InstallFinalize action. The InstallInitialize and
InstallFinalize actions must be present in the InstallExecuteSequence table and
the AdminExecuteSequence table.

Where can I get more information?

Microsoft Platform SDK – ICE77

ICE78

What does ICE78 check?

ICE78 verifies that the AdvtUISequence table either does not exist or is empty.
This is required because no user interface is allowed during advertising.

When does ICE78 show up?

ICE78 posts an error if the AdvtUISequence table exists and is not empty.

How can I fix ICE78?

To fix ICE78 error, either remove the action from the AdvtUISequence table, or
remove the AdvtUISequence table from the package.

Where can I get more information?

Microsoft Platform SDK – ICE78

ICE79

What does ICE79 check?

ICE79 validates the references to components and features entered in the


database fields using the Condition data type.

Note: The Condition data type is a text string containing a valid conditional
statement that can be evaluated as true or false.
When does ICE79 show up?

• ICE79 posts warning if _Validation table is missing in the installation


database.
• ICE79 also posts warning if there is an error retrieving value from a
column in a table.
• ICE79 posts error if an invalid component reference is found.
• ICE79 also posts error if an invalid feature reference is found.

How can I fix ICE79?

• To fix ICE79 error, enter valid records for conditions of feature and
conditions in the Feature and the Condition table.
• To fix ICE79 warning, add the _Validation table (if missing) in the
database.

Where can I get more information?

Microsoft Platform SDK – ICE79

ICE80

What does ICE80 check?

ICE80 validates that the value of the Template Summary Property


(PID_TEMPLATE) correctly specifies "Intel64" or "Intel" depending on the
presence of 64-bit components or custom action scripts.

ICE80 checks the Component Table for any 64-bit components and checks the
CustomAction Table for any 64-bit scripts.

ICE80 verifies that a package with "Intel64" in its Template Summary Property
also has a Page Count Summary Property (PID_PAGECOUNT) of at least 150
(i.e., Windows Installer version 1.1).

ICE80 also validates that the language ID specified by the ProductLanguage


property must be contained in the Template Summary Property.

When does ICE80 show up?

• ICE80 posts error if a package contains 64 bit component but the


Template Summary Property does not contain Intel64.
• ICE80 posts error if a package contains 64 bit custom action script but the
Template Summary Property does not contain Intel64.
• ICE80 posts error if there is a bad value in Summary Information Stream.
• ICE80 posts error if a package is marked with Intel64 but it has a schema
less than 150(i.e., Windows Installer version 1.1).
• ICE80 posts error if the package is 32-bit but it is using a 64-bit property.
• ICE80 posts error if the package is 32-bit but it is using 64 bit Locator
Type in a RegLocator table entry.
• ICE80 posts error if a 64-bit component is using a 32-bit directory.
• ICE80 posts error if a 32-bit component is using a 64-bit directory.
• ICE80 posts error if the value of the ProductLanguage property is not
listed in the Template Summary property.

How can I fix ICE80?

Based on the ICE80 error description, make the necessary modifications to


appropriate tables.

Where can I get more information?

Microsoft Platform SDK – ICE80

ICE81

What does ICE81 check?

ICE81 validates the MsiDigitalCertificate table and MsiDigitalSignature table. This


ICE custom action posts warnings for digital certificates that are unused or
unreferenced, and it posts an error when the signed object does not exist or
when the signed object's cabinet does not point to external data.

When does ICE81 show up?

• ICE81 posts warning if all or some Digital Certificate records are unused in
the installation database.
• ICE81 posts error the Media table does not exist but MsiDigitalSignature
has entries.
• ICE81 posts error if the Media table exists, but the entry in
MsiDigitalSignature is not present in Media table.
• ICE81 posts error if a signed object's cabinet does not point to external
data.

How can I fix ICE81?

• To fix ICE81 warning, add record(s) to MsiDigitalSignature table.


• If MsiDigitalSignature table has entries but the Media table does not exist,
add the Media table to the package and add records to the Media table.
• If a signed object’s cabinet does not point to external data, update the
cabinet so that it can point to an object outside the package.
Where can I get more information?

Microsoft Platform SDK – ICE81

ICE82

What does ICE82 check?

ICE82 validates that the RegisterProduct Action, RegisterUser Action,


PublishProduct Action, and PublishFeatures Action are all present in the
InstallExecuteSequence table. The package is validated if all the actions are
present.

Note: Not having all these actions prevents the application from being listed in
Add/Remove in the control panel and prevents the advertisement of the
application. Removing all of these actions prevents the application from being
registered with the Windows Installer configuration data. This means that you will
no longer be able to remove, repair, or reinstall the application using the
Windows Installer Command Line Options or the Windows Installer application
programming interface.

When does ICE82 show up?

• ICE82 posts a warning if RegisterProduct Action, RegisterUser Action,


PublishProduct Action, and PublishFeatures Action are absent in the
package.
• ICE82 posts a warning if there are two actions with the same sequence
number listed in the InstallExecuteSequence, InstallUISequence,
AdminExecuteSequence, AdminUISequence, or AdvtExecuteSequence
tables.
• ICE82 posts an error if some of the four actions (RegisterProduct Action,
RegisterUser Action, PublishProduct Action, and PublishFeatures Action)
are present and others are absent.

How can I fix ICE82?

• To fix ICE82 warning, add RegisterProduct, RegisterUser, PublishProduct,


and PublishFeatures actions to InstallExecuteSequence table (if they are
all missing). If the warning is due to a duplicate sequence number in a
sequence table, update the sequence numbers.
• To fix ICE82 error, add the missing actions among RegisterProduct,
RegisterUser, PublishProduct, and PublishFeatures actions to
InstallExecuteSequence table.

Where can I get more information?


Microsoft Platform SDK – ICE82

ICE83

What does ICE83 check?

ICE83 validates the MsiAssembly table.

Note: The MsiAssembly table specifies Windows Installer settings for


Microsoft .NET Framework assemblies and Win32 assemblies. If there is at least
one entry in the MsiAssembly table, the InstallExecuteSequence table must
contain the MsiPublishAssemblies action and MsiUnpublishAssemblies action.

This ICE custom action posts an error if the key path for a component containing
a Win32 assembly is set to the manifest file. Explicitly the error is posted if the
value entered in the KeyPath field of the Component table equals the value
entered in the File_Manifest field of the MsiAssembly table. This ICE custom
action posts an error if there is at least one record in the MsiAssembly table and
the InstallExecuteSequence table does not contain both the
MsiPublishAssemblies Action and MsiUnpublishAssemblies Action.

When does ICE83 show up?

• ICE83 posts an error when the KeyPath field for a Win32 Assembly is set
to its manifest file.
• ICE83 posts an error when there is at least one entry in the MsiAssembly
table but the InstallExecuteSequence table does not contain both the
MsiAssemblyPublish action and the MsiAssemblyUnpublish action.

How can I fix ICE83?

• For a Win32 assembly, do not specify a manifest file as the component's


key path file in the KeyPath field of the Component table.
• If there is at least one entry in the MsiAssembly table, make sure that the
InstallExecuteSequence table contains the MsiPublishAssemblies action
and MsiUnpublishAssemblies action.

Where can I get more information?

Microsoft Platform SDK – ICE83

ICE84

What does ICE84 check?


ICE84 checks the AdvtExecuteSequence table, AdminExecuteSequence table,
and the InstallExecuteSequence table to verify that the following standard actions
have not been set with conditions in the Condition field.

• CostInitialize action
• CostFinalize action
• FileCost action
• InstallValidate action
• InstallInitialize action
• InstallFinalize action
• ProcessComponents action
• PublishFeatures action
• PublishProduct action
• RegisterProduct action
• UnpublishFeatures action

If conditions are found, ICE84 posts a warning.

When does ICE84 show up?

ICE84 posts a warning if a required action has been authored with a condition.

How can I fix ICE84?

To fix ICE84, remove the conditions around required actions listed above.

Where can I get more information?

Microsoft Platform SDK – ICE84

ICE85

What does ICE85 check?

ICE85 validates that the SourceName column of the MoveFile table is a valid
long file name. This field may contain wildcard characters (* and ?).

Note: MoveFile table contains a list of files to be moved or copied from a


specified source directory to a specified destination directory.

When does ICE85 show up?

ICE85 posts an error if the SourceName field in the MoveFile table is not a valid
long file name.

How can I fix ICE85?


To fix this error, change the value found in the SourceName field of MoveFile
table to a valid file name.

Where can I get more information?

Microsoft Platform SDK – ICE85

ICE86

What does ICE86 check?

ICE86 issues a warning if the package uses the AdminUser property in database
column of the Condition type. Package authors should use the Privileged
property in conditional statements.

Note: The installer sets the AdminUser property on Windows NT/Windows 2000
if the user has administrator privileges. This property is always set on Windows
95 and Windows 98.

Note: The Privileged property indicates whether the installation is performed in


the context of elevated privileges. The installer sets this property if the user has
administrator privileges, if the application has been assigned by a system
administrator, or if both the user and machine policies AlwaysInstallElevated are
set to true.

When does ICE86 show up?

ICE86 posts a warning if AdminUser property was used in a Condition field.

How can I fix ICE86?

To fix this warning, replace AdminUser property with Priviliged property.

Note: The installer only sets the AdminUser property if the user is an
administrator. The installer sets the Privileged property if the user is an
administrator or if policy enables the user to install with elevated privileges.

Where can I get more information?

Microsoft Platform SDK – ICE86

ICE87

What does ICE87 check?


ICE87 validates that the following properties have not been authored in the
Property Table. These properties should instead be set on a command line.

• ADDLOCAL property (The value of the ADDLOCAL property is a list of


features delimited by commas that are to be installed locally.)
• REMOVE property (The value of the REMOVE property is a list of features
delimited by commas that are to be removed.)
• ADDSOURCE property (The value of the ADDSOURCE property is a list
of features delimited by commas that are to be installed to run from
source.)
• ADDDEFAULT property (The value of the ADDDEFAULT property is a list
of features delimited by commas that are to be installed in their default
configuration.)
• REINSTALL property (The value of the REINSTALL property is a list of
features delimited by commas that are to be reinstalled.)
• ADVERTISE property (The value of the ADVERTISE property is a list of
features delimited by commas that are to be advertised.)
• COMPADDLOCAL property (The value of the COMPADDLOCAL property
is a list of component GUIDs delimited by commas, that are to be installed
locally.)
• COMPADDSOURCE property (The value of the COMPADDSOURCE
property is a list of component GUIDs delimited by commas, that are to be
installed to run from the source media.)
• FILEADDLOCAL property (The value of the FILEADDLOCAL property
value is a list of file keys delimited by commas that are to be installed to
run locally.)
• FILEADDSOURCE property (The value of the FILEADDSOURCE property
denotes a list of file keys delimited by commas that are to be installed to
run from the source media.)
• FILEADDDEFAULT property (The value of the FILEADDDEFAULT
property is a list of file keys delimited by commas that are installed in their
default configuration.)

When does ICE87 show up?

ICE87 posts a warning if one of the properties listed above is authored into the
Property table. Doing so might cause the product to not be uninstalled correctly.

How can I fix ICE87?

To fix ICE87 warning, set the property on a command line instead of the Property
table. For example, msiexec /I setup.msi ADDLOCAL=Feature1,Feature2

Where can I get more information?

Microsoft Platform SDK – ICE87


ICE88

What does ICE88 check?

ICE88 validates that the directory referenced in the DirProperty column of the
IniFile table exists in the Windows Installer package.

ICE88 issues a warning if the DirProperty value does not represent a property in
the Directory, AppSearch, or Property tables, certain system folder properties, or
a property set by a type 51 custom action.

ICE88 scans the following tables and properties:

• Directory Table
• AppSearch Table
• Property Table
• CustomAction Table, where the custom action is a Custom Action Type 51
(i.e., Set Property)
• ProgramFilesFolder Property
• CommonFilesFolder Property
• SystemFolder Property
• ProgramFiles64Folder Property
• CommonFiles64Folder Property
• System64Folder Property

When does ICE88 show up?

ICE88 posts a warning if a directory property referenced in the DirProperty


column of the IniFile table does not exist in the installer package.

How can I fix ICE88?

To fix ICE88 warning, make the directory property referenced in the DirProperty
column of the IniFile table available by means of one of the alternative methods
listed above.

Where can I get more information?

Microsoft Platform SDK – ICE88

ICE89

What does ICE89 check?


ICE89 validates that the value in the Progid_Parent column in ProgId table is a
valid foreign key into the ProgId column in ProgId table. Every ProgId parent
should have a record in the ProgId table.

Note: The ProgId table contains information for program IDs and version
independent program IDs that must be generated as a part of the product
advertisement.

When does ICE89 show up?

ICE89 posts an error if a ProgId_Parent value in the ProgId table is not a valid
ProgId.

How can I fix ICE89?

To fix ICE89 error, add a new record for the parent ProgId in the ProgId table.

Where can I get more information?

Microsoft Platform SDK – ICE89

ICE90

What does ICE90 check?

ICE90 validates the Shortcut table and uses the Directory table. It checks if a
shortcut’s directory is specified as a public property and is under user profile
directory.

The names of Public Properties are written in uppercase letters. A shortcut


specified by a public property may not work if the value of the ALLUSERS
property changes in the UI sequence.

Note: The ALLUSERS property determines where the configuration information


of the installed application is stored (per-user versus per-machine). If ALLUSERS
is not set, the installer does a per-user installation.

When does ICE90 show up?

ICE90 posts a warning if it finds that a shortcut's directory has been specified as
a public property and is under user profile directory.

How can I fix ICE90?

To fix this warning, change your property name to become a private property
(i.e., use at least one lowercase letter in the name). If a private property is used,
you should NOT give any “Select Shortcut Folder” or “Program Group” type of
option on the user interface of your installer.

Note: On Windows XP, Windows 2000, and Windows NT, you cannot set a
private property in the user interface phase of the installation and then pass the
value to the execution phase. On earlier systems, this is possible because the
user interface and execution sequences run in the same process.

Where can I get more information?

Microsoft Platform SDK – ICE90

ICE91

What does ICE91 check?

ICE91 checks if a file, .ini file, or shortcut file is installed into a per-user only
directory. ICE91 warnings are harmless if the package is only used for per-user
installations and never used for per-machine installations.

Files, .ini files, or shortcuts in per-user only directories are installed into a
particular user's profile. Even if the user sets the ALLUSERS property for a per-
machine installation, files, .ini files, or shortcuts in per-user only directories are
not copied in to the "All Users" profile and are not available to other users. The
per-user only directories do not vary with the ALLUSERS property. The following
is a list of the per-user only directories:

• AppDataFolder
• FavoritesFolder
• NetHoodFolder
• PersonalFolder
• PrintHoodFolder
• RecentFolder
• SendToFolder
• MyPicturesFolder
• LocalAppDataFolder

Note: The ALLUSERS property determines where the configuration information


of the installed application is stored (per-user versus per-machine). If ALLUSERS
is not set, the installer does a per-user installation.

If a file or .ini file, or shortcut is set to be installed to the per user directory that
doesn't vary based on ALLUSERS value, this specific resource won't be copied
to each user's profile even if a per machine installation is desired.

When does ICE91 show up?


ICE91 posts a warning if a file, .ini file, or shortcut file is installed into a per-user
only directory.
If a file or .ini file, or shortcut is set to be installed to the per user directory that
doesn't vary based on ALLUSERS value, this specific resource won't be copied
to each user's profile even if a per machine installation is desired.

How can I fix ICE91?

ICE 91 warning message means that the MSI will only install the resource into
the user profile for the user account that executes the MSI, but not for any other
user accounts on the same machine.

As far as the application functionality is concerned, check to see if it is a


necessity that the resource be copied into each user’s profile for correct
functionality of the application or not. If the resource does not need to be in the
user profile to work (i.e., it might work in a folder under All Users profile) then
install it to a folder under All Users profile.

If the resource must be copied to each user’s profile, then add functionality to
your package to do this. To achieve this, add a current user registry key (i.e., just
a dummy registry key) and make this registry key the key path of the component
which contains the resource. This means that the resource will be copied to the
next user’s profile as part of the MSI self healing mechanism, provided that
advertised entry points exist for the product.

Where can I get more information?

Microsoft Platform SDK – ICE91

ICE92

What does ICE92 check?

ICE92 verifies that a component without a Component Id GUID is not also


specified as a permanent component.

ICE92 checks the Component Table for components without a GUID specified in
the ComponentId field and verifies that they are not specified as permanent
components. Permanent components are left behind after uninstalling the
application.

If the ComponentId column is null, the installer does not register the component
and the component cannot be removed or repaired by the installer.

When does ICE92 show up?


ICE92 posts error if a component has no ComponentId and is marked as
permanent.

How can I fix ICE92?

To fix ICE92, assign a GUID to the component or remove the permanent mark
from the component.

Where can I get more information?

Microsoft Platform SDK – ICE92

ICE93

What does ICE93 check?

ICE93 checks if a custom action uses the same name as a standard action.

When does ICE93 show up?

ICE93 issues a warning if a custom action uses the same name as a standard
action.

How can I fix ICE93?

To fix ICE93, rename your custom action to a name other than standard action
names.

Where can I get more information?

Microsoft Platform SDK – ICE93

ICE94

What does ICE94 check?

ICE94 checks the Shortcut table, Feature table, and MsiAssembly table and
posts a warning if there are any unadvertised shortcuts pointing to an assembly
file in the global assembly cache.

When does ICE94 show up?

ICE94 posts a warning if there are any unadvertised shortcuts pointing to an


assembly file in the global assembly cache.

How can I fix ICE94?


To fix ICE94, make the shortcut advertised.

Note: If the entry in the Target field of the Shortcut table is not a feature in the
Feature table, the shortcut is unadvertised. If the entry in the Component_ field of
the Shortcut table is also listed in the MsiAssembly table, the shortcut points to
an assembly file. If the entry in the File_Application field in the MsiAssembly table
is empty, the assembly file is in the global assembly cache.

Where can I get more information?

Microsoft Platform SDK – ICE94

ICE95

What does ICE95 check?

ICE95 checks the Control table and BBControl table to verify that the billboard
controls fit onto all the billboards.

Note: The BBControl table lists the controls to be displayed on each billboard.
The Control table defines the controls that appear on each dialog box.

When does ICE95 show up?

ICE95 posts a warning if a billboard control does not fit on a billboard.

How can I fix ICE95?

To fix ICE95, resize and/or reposition the billboard to fit on the billboard.

Where can I get more information?

Microsoft Platform SDK – ICE95

ICE96

What does ICE96 check?

ICE96 verifies that the PublishFeatures action and the PublishProduct action are
entered in the AdvtExecuteSequence table. A package cannot be advertised
without these actions.

Note: The PublishFeatures action writes each feature's state into the system
registry.
Note: The PublishProduct action manages the advertisement of the product
information with the system. It publishes the product if the product is in advertise
mode or if any feature is being installed or reinstalled.

When does ICE96 show up?

ICE96 posts a warning if PublishFeatures and/or PublishProduct actions are not


specified in the advertising sequence table (i.e., AdvtExecuteSequence).

How can I fix ICE96?

To fix ICE96, add PublishFeatures and/or PublishProduct standard actions to


AdvtExecuteSequence table.

Where can I get more information?

Microsoft Platform SDK – ICE96

ICE98

What does ICE98 check?

ICE98 verifies that data source names (DSN) that use the ODBCDataSource
Table do not contain invalid characters and do not exceed the maximum length
of SQL_MAX_DSN_LENGTH (32 characters).

When does ICE98 show up?

ICE98 posts a warning if a data source name contains invalid characters or


exceeds the maximum limit of 32 characters.

How can I fix ICE98?

To fix ICE98, use a valid data source name which is less than 32 characters.

Where can I get more information?

Microsoft Platform SDK – ICE98

ICE99

What does ICE99 check?

ICE99 verifies that that no property name entered in the Directory table
duplicates a name reserved for the public or private use of the Windows Installer.
When does ICE99 show up?

ICE99 posts a warning if a directory name used in the package is the same as
one of the MSI Public Properties.

How can I fix ICE99?

To fix ICE99 warning, change the value in the Directory column of the Directory
table so that it does not duplicate a property name reserved by the Windows
Installer.

Where can I get more information?

Microsoft Platform SDK – ICE99