通过Windows中的安装程序安装根证书时出现未知错误

时间:2016-05-10 09:43:09

标签: .net installation windows-installer setup-project windows-server-2012

我正在尝试从我的安装应用程序中将证书安装到root中。如果我从管理员帐户运行,安装应用程序运行良好,但是当我从普通用户帐户运行安装程序时,我收到一条空的错误消息(而不是安全警告消息),如下所示。

enter image description here

我查看了Windows事件查看器,发现与此错误无关。我在将证书添加到商店之前尝试显示一个虚拟MessageBox,令我惊讶的是,我可以看到安全警告窗口正确显示。如果我删除虚拟消息框代码,我将再次收到相同的空错误消息。

enter image description here

代码:

private bool AddCertificate(StoreName storeName, X509Certificate2 certificate)
{
    if (certificate == null)
            throw new ArgumentException("Parameter cannot be null");

     X509Store store = new X509Store(storeName, StoreLocation.CurrentUser);
     StorePermission sp = new StorePermission(PermissionState.Unrestricted);
     sp.Flags = StorePermissionFlags.OpenStore;
     sp.Assert();
     store.Open(OpenFlags.MaxAllowed);

     MessageBox.Show("hello");

     store.Add(certificate);
     store.Close();
     return true;
}

调查了Windows事件查看器,可以找到一个事件" Application Popup"在我收到此空错误消息时生成系统日志。



- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
+ <System>
  <Provider Name="Application Popup" Guid="{47BFA2B7-BD54-4FAC-B70B-29021084CA8F}" /> 
  <EventID>26</EventID> 
  <Version>0</Version> 
  <Level>4</Level> 
  <Task>0</Task> 
  <Opcode>0</Opcode> 
  <Keywords>0x8000000000000000</Keywords> 
  <TimeCreated SystemTime="2016-05-10T10:02:57.622220900Z" /> 
  <EventRecordID>30630</EventRecordID> 
  <Correlation /> 
  <Execution ProcessID="1556" ThreadID="1296" /> 
  <Channel>System</Channel> 
  <Computer>abcd.efgh.net</Computer> 
  <Security UserID="S-1-5-18" /> 
  </System>
- <EventData>
  <Data Name="Caption" /> 
  <Data Name="Message" /> 
  </EventData>
  </Event>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

一些额外的信息可能有所帮助。如果这是一个Visual Studio安装程序项目MSI安装运行Everyone(InstallAllUsers),那么它应该在自定义操作运行之前提升(您将看到一个提升提示),并且CA将与系统帐户一起运行。在这种情况下,不需要以管理员身份运行,但为当前用户(本地系统帐户)存储证书可能不是您想要的。另外,你试过StoreLocation.LocalMachine吗?

但是,如果这是一个只是我安装,那么自定义操作将不会被提升所以是的,如果需要提升并且您需要以管理员身份运行Just me install,并且当前用户是安装用户。考虑到这两种相当不同的行为,很难弄清楚你打算做什么,或者可能导致问题,而且我们不知道你是在做每个人还是只做我。

此外,正如完整性检查一样,您是否还有其他可能存在问题的自定义操作?这是为了防止另一个自定义操作在未提升时出错。