【问题标题】:Clickonce full trust app update failing with TrustNotGrantedException on Windows 8Clickonce 完全信任应用程序更新失败并在 Windows 8 上出现 TrustNotGrantedException
【发布时间】:2013-02-04 13:57:55
【问题描述】:

我们有一个 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()

【问题讨论】:

  • 尝试了另一台 Windows 8 笔记本电脑,但升级失败,同样错误。想知道完全信任应用程序会出现什么问题。 -Manish。

标签: c# .net winforms visual-studio clickonce


【解决方案1】:

我唯一一次看到这个堆栈跟踪是在我尝试调用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();

【讨论】:

  • 就像 OP 一样,我收到了 TrustNotGrantedException。您的回答使我能够通过更新应用程序有效地更进一步。但是现在ApplicationDeployment.IsNetworkDeployedFalse。有什么直截了当的想法还是我应该提出一个问题?
【解决方案2】:

从这个MSDN page 有两个原因。但似乎TrustNotGrantedException 通常在部署新的 ClickOnce 更新时引发,该更新使用比以前版本更多的权限...

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

所以更新失败是有道理的,因为自用户上次安装以来应用程序的安全级别已经改变 - 所以他们需要重新安装它。

【讨论】:

  • 问题是如何确定新部署比以前的部署具有更多权限 - 通过清单?我的清单看起来完全一样(包括 trustInfo 元素)(显然不包括依赖程序集的版本号和 digestValue 元素)
  • 这个答案实际上帮助了我。就我而言,版本之间的区别在于在较新版本中播放声音文件。所以我想,播放声音文件意味着更多的特权。重新安装应用程序解决了这个问题。谢谢@CrazyTim。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多