示例#1
0
        /// <summary>
        /// Returns the component path if any component is installed.
        /// </summary>
        /// <param name="what">What component to find.</param>
        /// <returns>The component path if any component is installed.</returns>
        internal static string Find(KnownComponent what)
        {
            ICollection<string> componentIds = null;
            switch (what)
            {
                case KnownComponent.Orca:
                    componentIds = new string[]
                    {
                        "{958A3933-8CE7-6189-F0EF-CAE467FABFF4}", // Orca > 8.0
                        "{BE928E10-272A-11D2-B2E4-006097C99860}", // Orca <= 5.0
                    };
                    break;

                case KnownComponent.Darice:
                    componentIds = new string[]
                    {
                        "{D865CA5E-9B46-B345-B3A6-43C5EAF209E0}", // Orca > 8.0
                        "{EAB27DFE-90C6-11D2-88AC-00A0C981B015}", // Orca <= 5.0
                    };
                    break;
            }

            foreach (var componentId in componentIds)
            {
                var component = new ComponentInstallation(componentId);
                if (InstallState.Local == component.State)
                {
                    return component.Path;
                }
            }

            return null;
        }
示例#2
0
        public static string GetComponentInfo(string prodCode, string compId, MsiComponentSearchType type)
        {
            string msiComponent = string.Empty;
            ComponentInstallation ci = null;

            if (string.IsNullOrEmpty(prodCode))
                ci = new ComponentInstallation(compId);
            else
                ci = new ComponentInstallation(compId, prodCode);

            switch(type)
            {
                case MsiComponentSearchType.directory:
                    msiComponent = ci.Path; // TODO
                    break;
                case MsiComponentSearchType.keyPath:
                    msiComponent = ci.Path;
                    break;
                case MsiComponentSearchType.state:
                    msiComponent = ci.State.ToString();
                    break;
            }

            return msiComponent;
        }
示例#3
0
文件: Module.cs 项目: heaths/psmsi
 /// <summary>
 /// Increments the use count and sets the last used date if the Module installer was installed.
 /// </summary>
 public static void Use()
 {
     // Enumerate all clients for the primary component if installed.
     ComponentInstallation comp = new ComponentInstallation(ModuleId);
     foreach (ProductInstallation product in comp.ClientProducts)
     {
         // If the feature is installed locally for this client, increment usage.
         FeatureInstallation feature = new FeatureInstallation(FeatureName, product.ProductCode);
         if (feature.State == InstallState.Local)
         {
             Installer.UseFeature(product.ProductCode, FeatureName, InstallMode.NoDetection);
         }
     }
 }
示例#4
0
文件: components.cs 项目: zooba/wix3
        public DataView GetComponentProductsData(string componentCode)
        {
            DataTable table = new DataTable("ComponentProducts");
            table.Locale = CultureInfo.InvariantCulture;
            table.Columns.Add("ComponentProductsProductName", typeof(string));
            table.Columns.Add("ComponentProductsProductCode", typeof(string));
            table.Columns.Add("ComponentProductsComponentPath", typeof(string));

            if(this.componentProductsMap != null)
            {
                ArrayList componentProducts = (ArrayList) this.componentProductsMap[componentCode];
                foreach(string productCode in componentProducts)
                {
                    string productName = MsiUtils.GetProductName(productCode);
                    string componentPath = new ComponentInstallation(componentCode, productCode).Path;
                    table.Rows.Add(new object[] { productName, productCode, componentPath });
                }
                return new DataView(table, "", "ComponentProductsProductName ASC", DataViewRowState.CurrentRows);
            }
            return null;
        }
示例#5
0
文件: components.cs 项目: zooba/wix3
        private object[][] GetComponentRegistryRows(string productCode, string componentCode, Session session, bool includeComponent)
        {
            ArrayList rows = new ArrayList();
            string componentPath = new ComponentInstallation(componentCode, productCode).Path;

            string componentKey = (string) session.Database.ExecuteScalar(
                "SELECT `Component` FROM `Component` WHERE `ComponentId` = '{0}'", componentCode);
            if(componentKey == null) return null;
            int attributes = Convert.ToInt32(session.Database.ExecuteScalar(
                "SELECT `Attributes` FROM `Component` WHERE `Component` = '{0}'", componentKey));
            bool registryKeyPath = (attributes & (int) ComponentAttributes.RegistryKeyPath) != 0;
            if(!registryKeyPath && componentPath.Length > 0) componentPath = Path.GetDirectoryName(componentPath);
            string keyPath = (string) session.Database.ExecuteScalar(
                "SELECT `KeyPath` FROM `Component` WHERE `Component` = '{0}'", componentKey);

            using (View view = session.Database.OpenView("SELECT `Registry`, `Root`, `Key`, `Name`, " +
                "`Value` FROM `Registry` WHERE `Component_` = '{0}'", componentKey))
            {
                view.Execute();

                foreach (Record rec in view) using (rec)
                {
                    string regName = (string) rec["Name"];
                    if(regName == "-") continue;  // Don't list deleted keys

                    string regTableKey = (string) rec["Registry"];
                    bool isKey = registryKeyPath && keyPath == regTableKey;
                    string regPath = this.GetRegistryPath(session, (RegistryRoot) Convert.ToInt32(rec["Root"]),
                        (string) rec["Key"], (string) rec["Name"]);

                    string dbValue;
                    using(Record formatRec = new Record(0))
                    {
                        formatRec[0] = rec["Value"];
                        dbValue = session.FormatRecord(formatRec);
                    }

                    string installedValue = this.GetRegistryValue(regPath);
                    bool exists = installedValue != null;
                    if(!exists) installedValue = "";
                    bool match = installedValue == dbValue;

                    object[] row;
                    if(includeComponent) row = new object[] { isKey, regTableKey, regPath, exists, dbValue, installedValue, match, componentCode };
                    else row = new object[] { isKey, regTableKey, regPath, exists, dbValue, installedValue, match };
                    rows.Add(row);
                }
            }

            return (object[][]) rows.ToArray(typeof(object[]));
        }
示例#6
0
文件: components.cs 项目: zooba/wix3
        private object[][] GetComponentFilesRows(string productCode, string componentCode, Session session, bool includeComponent)
        {
            ArrayList rows = new ArrayList();
            string componentPath = new ComponentInstallation(componentCode, productCode).Path;

            string componentKey = (string) session.Database.ExecuteScalar(
                "SELECT `Component` FROM `Component` WHERE `ComponentId` = '{0}'", componentCode);
            if(componentKey == null) return null;
            int attributes = Convert.ToInt32(session.Database.ExecuteScalar(
                "SELECT `Attributes` FROM `Component` WHERE `Component` = '{0}'", componentKey));
            bool registryKeyPath = (attributes & (int) ComponentAttributes.RegistryKeyPath) != 0;
            if(!registryKeyPath && componentPath.Length > 0) componentPath = Path.GetDirectoryName(componentPath);
            string keyPath = (string) session.Database.ExecuteScalar(
                "SELECT `KeyPath` FROM `Component` WHERE `Component` = '{0}'", componentKey);

            using (View	view = session.Database.OpenView("SELECT `File`, `FileName`, `Version`, `Language`, " +
                "`Attributes` FROM `File` WHERE `Component_` = '{0}'", componentKey))
            {
                view.Execute();

                foreach (Record rec in view) using (rec)
                {
                    string fileKey = (string) rec["File"];
                    bool isKey = !registryKeyPath && keyPath == fileKey;

                    string dbVersion = (string) rec["Version"];
                    bool versionedFile = dbVersion.Length != 0;
                    if(versionedFile)
                    {
                        string language = (string) rec["Language"];
                        if(language.Length > 0)
                        {
                            dbVersion = dbVersion + " (" + language + ")";
                        }
                    }
                    else if(session.Database.Tables.Contains("MsiFileHash"))
                    {
                        IList<int> hash = session.Database.ExecuteIntegerQuery("SELECT `HashPart1`, `HashPart2`, " +
                            "`HashPart3`, `HashPart4` FROM `MsiFileHash` WHERE `File_` = '{0}'", fileKey);
                        if(hash != null && hash.Count == 4)
                        {
                            dbVersion = this.GetFileHashString(hash);
                        }
                    }

                    string filePath = GetLongFileName((string) rec["FileName"]);
                    bool exists = false;
                    bool installedMatch = false;
                    string installedVersion = "";
                    if(!registryKeyPath && componentPath.Length > 0)
                    {
                        filePath = Path.Combine(componentPath, filePath);

                        if(File.Exists(filePath))
                        {
                            exists = true;
                            if(versionedFile)
                            {
                                installedVersion = Installer.GetFileVersion(filePath);
                                string language = Installer.GetFileLanguage(filePath);
                                if(language.Length > 0)
                                {
                                    installedVersion = installedVersion + " (" + language + ")";
                                }
                            }
                            else
                            {
                                int[] hash = new int[4];
                                Installer.GetFileHash(filePath, hash);
                                installedVersion = this.GetFileHashString(hash);
                            }
                            installedMatch = installedVersion == dbVersion;
                        }
                    }

                    object[] row;
                    if(includeComponent) row = new object[] { isKey, fileKey, filePath, exists, dbVersion, installedVersion, installedMatch, componentCode };
                    else row = new object[] { isKey, fileKey, filePath, exists, dbVersion, installedVersion, installedMatch };
                    rows.Add(row);
                }
            }

            return (object[][]) rows.ToArray(typeof(object[]));
        }
示例#7
0
 /// <summary>
 /// Creates a new ComponentInstallation, automatically detecting the
 /// product that the component is a part of.
 /// </summary>
 /// <param name="componentCode">component GUID</param>
 /// <param name="szUserSid">context user SID</param>
 /// <param name="dwContext">user contexts</param>
 public ComponentInstallation(string componentCode, string szUserSid, UserContexts dwContext)
     : this(componentCode, ComponentInstallation.GetProductCode(componentCode, szUserSid, dwContext), szUserSid, dwContext)
 {
 }
示例#8
0
 /// <summary>
 /// Creates a new ComponentInstallation, automatically detecting the
 /// product that the component is a part of.
 /// </summary>
 /// <param name="componentCode">component GUID</param>
 /// <remarks><p>
 /// Win32 MSI API:
 /// <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetproductcode.asp">MsiGetProductCode</a>
 /// </p></remarks>
 public ComponentInstallation(string componentCode)
     : this(componentCode, ComponentInstallation.GetProductCode(componentCode))
 {
 }
示例#9
0
 /// <summary>
 /// Enumerates the selected components and write them to the pipeline.
 /// </summary>
 protected override void EndProcessing()
 {
     this.allParameters.ForEach((param) =>
         {
             if (param.ParameterSetName == ParameterSet.Component)
             {
                 if (param.ComponentCode != null && param.ComponentCode.Length > 0)
                 {
                     // Enumerate all clients for a component.
                     foreach (string componentCode in param.ComponentCode)
                     {
                         ComponentInstallation component = new ComponentInstallation(componentCode);
                         this.WriteSharedComponent(component);
                     }
                 }
                 else
                 {
                     // Enumerate all components.
                     foreach (ComponentInstallation component in ComponentInstallation.AllComponents)
                     {
                         this.WriteSharedComponent(component);
                     }
                 }
             }
             else if (param.ParameterSetName == ParameterSet.Product)
             {
                 // Enumerate all components for the specified product.
                 foreach (string componentCode in param.ComponentCode)
                 {
                     ComponentInstallation component = new ComponentInstallation(componentCode, param.ProductCode);
                     this.WriteComponent(component);
                 }
             }
         });
 }
示例#10
0
 /// <summary>
 /// Enumerates clients of the component and writes each client-specific component to the pipeline.
 /// </summary>
 /// <param name="component">The shared <see cref="ComponentInstallation"/> object to write to the pipeline.</param>
 private void WriteSharedComponent(ComponentInstallation component)
 {
     foreach (ProductInstallation client in component.ClientProducts)
     {
         ComponentInstallation shared = new ComponentInstallation(component.ComponentCode, client.ProductCode);
         this.WriteComponent(shared);
     }
 }
示例#11
0
 /// <summary>
 /// Attaches additional properties to the component and writes it to the pipeline.
 /// </summary>
 /// <param name="component">The <see cref="ComponentInstallation"/> object to write to the pipeline.</param>
 private void WriteComponent(ComponentInstallation component)
 {
     PSObject obj = PSObject.AsPSObject(component);
     this.WriteObject(obj);
 }