我们在C#中有一个winforms clickonce应用程序,该应用程序被授予完全信任并使用有效证书进行签名。
应用程序运行正常并在Windows XP,Windows 7上正确更新。但是,在Windows 8计算机上,它无法更新。应用程序运行正常。但是,升级到更高版本的第一个更新请求将失败:System.Deployment.Application.TrustNotGrantedException
调用ApplicationDeployment::CheckForDetailedUpdate()
失败后代码失败。想知道为什么会发生这种情况,因为完全相同的代码在所有以前版本的Windows上运行正常。任何帮助将不胜感激。以下是相关的堆栈跟踪:
System.Deployment.Application.TrustNotGrantedException: User has refused to grant required permissions to the application.
at System.Deployment.Application.ApplicationTrust.RequestTrust(SubscriptionState subState, Boolean isShellVisible, Boolean isUpdate, ActivationContext actCtx, TrustManagerContext tmc)
at System.Deployment.Application.DeploymentManager.DetermineTrustCore(Boolean blocking, TrustParams tp)
at System.Deployment.Application.DeploymentManager.DetermineTrust(TrustParams trustParams)
at System.Deployment.Application.ApplicationDeployment.CheckForDetailedUpdate(Boolean persistUpdateCheckResult)
at System.Deployment.Application.ApplicationDeployment.CheckForDetailedUpdate()
我唯一一次看到这个堆栈跟踪的时候是我试图调用CheckForDetailedUpdate()
而没有事先设置显式信任。添加下面的代码后,更新检查工作。
// Setup the trust level
var deployment = ApplicationDeployment.CurrentDeployment;
var appId = new ApplicationIdentity(deployment.UpdatedApplicationFullName);
var unrestrictedPerms = new PermissionSet(PermissionState.Unrestricted);
var appTrust = new ApplicationTrust(appId) {
DefaultGrantSet = new PolicyStatement(unrestrictedPerms),
IsApplicationTrustedToRun = true,
Persist = true
};
ApplicationSecurityManager.UserApplicationTrusts.Add(appTrust);
// Check for update
var info = deployment.CheckForDetailedUpdate();
从这个MSDN page有两个原因。但是,当部署了一个使用比以前版本更多权限的新ClickOnce更新时,通常会引发TrustNotGrantedException
...
- 应用程序使用权限提升,用户拒绝提升信任的请求;要么
- 应用程序使用受信任的应用程序部署,用于签署应用程序的数字证书未在本地计算机上列为受信任的发布者。如果您已将更新部署到应用程序,并且更新使用的权限比以前的版本多,并且ClickOnce会抛出TrustNotGrantedException,则不会安装新版本。
因此,它无法更新是有道理的,因为自用户上次安装以来应用程序安全级别已发生变化 - 因此他们需要重新安装它。
我们遇到了同样的问题,最终使用了InPlaceHostingManager类。它用于安装或更新ClickOnce部署。 GetManifestAsync()
发射了GetManifestCompleted
事件,它为您提供版本号。然后你可以调用DownloadApplicationAsync()
并处理DownloadApplicationCompleted
事件。到目前为止,这个工作并没有抛出TrustNotGrantedException。