使用WiX安装程序进行证书检测/安装

时间:2014-04-29 18:26:14

标签: wix certificate windows-installer

使用WiX,有没有办法检测机器上是否安装了证书?是否必须使用C#运行自定义操作以检测证书是否已安装,或者是否存在使用WiX的内置方式来执行此操作。我知道如何使用WiX安装证书,但需要一些自定义逻辑来检测它是否已经存在。

例如......

我们的安装程序是每用户安装,这意味着我们没有对本地机器证书存储的写入权限(尽管我们有读访问权限)。我的.wxs文件中有以下组件,用于将证书添加到用户证书存储区:

  <Component Id="C__IntermediateCert" Guid="{GUID_HERE}" Permanent="no" >
    <iis:Certificate Id="_IntermediateCert" BinaryKey="B__IntermediateCert" StoreName="ca" Overwrite="no"
         StoreLocation="currentUser" Name="Intermediate Cert Name" Request="no" />
  </Component>

问题是,如果本地计算机证书存储中已存在具有此名称的证书,则此行将失败,即使我们指定了overwrite = no。引发了安装程序错误,用户无法继续安装。

因此,我要实现的解决方法是首先查看证书是否已安装在计算机上(在本地计算机或用户中),如果已安装该组件,则跳过该组件。但是,它似乎没有出现只搜索证书(就像文件/目录一样)。

任何有关如何搜索证书的建议或帮助,或者指出我在证书创建中做错了什么(如果已经安装,请正确忽略)将不胜感激!

编辑:(使用正确的解决方案)

添加一些我尝试过的解决方法的信息,现在正在运行。我最终创建了一个C#自定义操作,应该检查证书是否存在

见这里:

    public static ActionResult CheckForExistingCertificate(Session session)
    {
        session.Log("Starting CheckForExistingCertificate");

        try
        {
            session.Log("***** Beginning LocalMachine Certificate Store Search...");
            X509Store lmStore = new X509Store(StoreName.CertificateAuthority, StoreLocation.LocalMachine);
            lmStore.Open(OpenFlags.ReadOnly);
            session.Log("***** lmStore.Certificates.Count = " + lmStore.Certificates.Count);
            foreach(X509Certificate2 cert in lmStore.Certificates)
            {
                session.Log("lmCertificate Listing : " + cert.FriendlyName);
                if (cert.FriendlyName == "Intermediate Cert Name")
                {
                    session["INTERMEDIATECERTIFICATEALREADYINSTALLED"] = "TRUE";
                }
            }

            session.Log("***** Beginning CurrentUser Certificate Store Search...");
            X509Store cuStore = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser);
            cuStore.Open(OpenFlags.ReadOnly);
            session.Log("***** cuStore.Certificates.Count = " + cuStore.Certificates.Count);
            foreach (X509Certificate2 cert in cuStore.Certificates)
            {
                session.Log("cuCertificate Listing : " + cert.FriendlyName);
                if (cert.FriendlyName == "Intermediate Cert Name")
                {
                    session["INTERMEDIATECERTIFICATEALREADYINSTALLED"] = "TRUE";
                }
            }

        }
        catch
        {
            session.Log("CheckForExistingCertificate - in catch");
        }

        session.Log("Ending CheckForExistingCertificate - end of function");
        return ActionResult.Success;
    }

1 个答案:

答案 0 :(得分:2)

有趣的是,我上周遇到了完全相同的错误。我真的反对截止日期,所以我只是写了一个自定义操作来删除证书(如果它存在并且正在重新安装组件)。但是,是的,我认为这是一个WiX 3.8错误,因为如果覆盖=否,它不应该导致问题。

在我的情况下,我们通过组策略和MSI分发证书,以确保我们尽可能接近100%的覆盖率。 MSI工作并且GPO工作但是在应用GPO之后MSI失败了。我删除了加载GPO的证书,加载了我的版本,然后当你执行GPUPDATE -FORCE时,你最终获得了两份证书,但没有明显的负面副作用。