【问题标题】:Certificate Detection/Installation with WiX Installer使用 WiX 安装程序进行证书检测/安装
【发布时间】:2014-04-30 09:21:03
【问题描述】:

使用 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;
    }

【问题讨论】:

    标签: wix certificate windows-installer


    【解决方案1】:

    有趣的是,我上周遇到了完全相同的错误。我真的快到最后期限了,所以我只写了一个自定义操作来删除证书(如果它存在并且正在重新安装组件)。但是,是的,我相信这是一个 WiX 3.8 错误,因为如果 overwrite=no 它不应该引起问题。

    就我而言,我们通过组策略和 MSI 分发证书,以确保我们的覆盖率尽可能接近 100%。 MSI 工作,GPO 工作,但在应用 GPO 后 MSI 失败。我删除了 GPO 加载的证书,加载了我的证书,然后当您执行 GPUPDATE -FORCE 时,您最终会得到两个证书副本,但没有明显的负面影响。

    【讨论】:

    • 克里斯 - 感谢您的跟进!您介意解释一下您删除证书的自定义操作吗?此外,我的安装程序将没有权限删除证书,因为我正在运行 Per-User 上下文,并且现有证书可能是 Machine/GPO(如您的场景)。我走上了进行自定义操作的路线,在上面的问题中进行了编辑,但它没有在 X509 证书存储中返回任何结果。您是否使用了不同的技术来实现它?
    • 我是每台机器的提升安装,我的证书冲突在计算机帐户中 |受信任的出版商商店。我使用 C#/DTF 编写了一个托管自定义操作,该操作使用了 .NET Framework 基类库中的 X509Certificate 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    相关资源
    最近更新 更多