Windows 8.1 和 Windows 10 之间的 UAC 提升行为差异

UAC Elevation Behavior Differences Between Windows 8.1 and Windows 10

我们有一个 C# Windows Forms 客户端应用程序。此应用程序有时需要从受信任的内部网站检查对自身的更新、下载更新、安装更新并自行重启。

为了使应用程序与用户帐户控制 (UAC) 兼容,我们在请求最高可用权限的 .exe 中嵌入了一个清单:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
  <security>
    <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
      <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
    </requestedPrivileges>
  </security>
</trustInfo>

我们希望标准(非管理员)用户能够 运行 应用程序而不会被提示提升为管理员。我们授予标准用户对整个应用程序文件夹的完全权限。这意味着用户有权随意修改软件文件,但这是可以接受的。

用户在 Windows 7、Windows 8 和 Windows 8.1 上使用此应用程序已经有一段时间了,并且完全启用了 UAC。在这些操作系统上,当我们的应用程序启动时,Windows 不会提示用户提升到管理员权限。

我们现在正在 Windows 10 上测试行为。在 Windows 10 系统上,启用完整的 UAC,Windows 会提示标准用户提升为管理员。其他一切都没有改变。 .EXE 是相同的,嵌入式清单是相同的请求执行级别 highestAvailable

我们已经使用 C:\Program Files 和 C:\Users\Public 中的客户端文件对此进行了测试。这两个位置具有相同的行为。

为什么 Windows 10 上的 UAC 提升行为不同?以前版本的行为是 UAC 中的错误吗?是不是应该一直提示提升?

请注意,我们必须启用 UAC。我知道如何禁用它。

另请注意,我已测试将清单更改为 asInvokerrequestedExecutionLevel。这不是在 Windows 10.

上提示提升

-- 更新--

我们已经跟踪到本地用户和域用户之间差异的提升提示。 This MSDN article 说:

Application launch behavior for a standard user with additional privileges (E.G. Backup Operator)...[will] prompt for credentials before running the application

我们看到本地标准用户未提示提升,但提示本地域用户提升。域用户对受限用户的唯一特权是成为域用户角色的成员。

你想不明白highestAvailable。这意味着如果您的帐户是管理员组的一部分,则请求完整的管理员令牌,但对于普通标准用户,不会显示 UAC 对话框,并且该过程使用标准令牌运行。

如果您的程序需要管理员权限才能运行,那么您需要在清单中使用 requireAdministrator。当标准用户启动此类过程时,会显示 over-the-shoulder UAC 对话框,用户可以在其中输入管理员帐户的凭据。