9

我们在 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()
4

3 回答 3

6

我唯一一次看到这个堆栈跟踪是当我尝试在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();
于 2013-05-29T14:16:22.243 回答
2

从这个MSDN 页面有两个原因。TrustNotGrantedException但是,当部署了比以前版本使用更多权限的新 ClickOnce 更新时,似乎 通常会引发这种情况......

  • 应用程序使用权限提升,用户拒绝提升信任的请求;或者
  • 应用程序使用受信任的应用程序部署,并且用于签署应用程序的数字证书未列为本地计算机上的受信任发布者。如果您已将更新部署到应用程序,并且更新使用的权限比以前的版本更多,并且 ClickOnce 引发了 TrustNotGrantedException,则新版本将不会安装

因此,它无法更新是有道理的,因为自用户上次安装以来应用程序的安全级别发生了变化——因此他们需要重新安装它。

于 2016-09-15T01:46:42.580 回答
0

我们遇到了同样的问题,最终使用了InPlaceHostingManager类。它用于安装或更新 ClickOnce 部署。GetManifestAsync()触发GetManifestCompleted事件,它会为您提供版本号。然后您可以调用DownloadApplicationAsync()并处理该DownloadApplicationCompleted事件。到目前为止,这是可行的,并且没有抛出 TrustNotGrantedException。

于 2019-02-26T13:08:30.753 回答