使用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;
}
答案 0 :(得分:2)
有趣的是,我上周遇到了完全相同的错误。我真的反对截止日期,所以我只是写了一个自定义操作来删除证书(如果它存在并且正在重新安装组件)。但是,是的,我认为这是一个WiX 3.8错误,因为如果覆盖=否,它不应该导致问题。
在我的情况下,我们通过组策略和MSI分发证书,以确保我们尽可能接近100%的覆盖率。 MSI工作并且GPO工作但是在应用GPO之后MSI失败了。我删除了加载GPO的证书,加载了我的版本,然后当你执行GPUPDATE -FORCE时,你最终获得了两份证书,但没有明显的负面副作用。