【发布时间】: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