public void Execute()
        {
            var trackedFiles = new List <ITrackedFile>();
            var stopwatch    = Stopwatch.StartNew();

            this.Messaging.Write(VerboseMessages.ValidatingDatabase());

            // Ensure the temporary files can be created the working folder.
            var workingFolder = Path.Combine(this.IntermediateFolder, "_validate");

            Directory.CreateDirectory(workingFolder);

            // Copy the database to a temporary location so it can be manipulated.
            // Ensure it is not read-only.
            var workingDatabasePath = Path.Combine(workingFolder, Path.GetFileName(this.OutputPath));

            FileSystem.CopyFile(this.OutputPath, workingDatabasePath, allowHardlink: false);

            var trackWorkingDatabase = this.BackendHelper.TrackFile(workingDatabasePath, TrackedFileType.Temporary);

            trackedFiles.Add(trackWorkingDatabase);

            var attributes = File.GetAttributes(workingDatabasePath);

            File.SetAttributes(workingDatabasePath, attributes & ~FileAttributes.ReadOnly);

            var validator = new WindowsInstallerValidator(this, workingDatabasePath, this.CubeFiles, this.Ices, this.SuppressedIces);

            validator.Execute();

            stopwatch.Stop();
            this.Messaging.Write(VerboseMessages.ValidatedDatabase(stopwatch.ElapsedMilliseconds));


            this.TrackedFiles = trackedFiles;
        }