我们有一个C#Windows窗体客户端应用程序。此应用程序偶尔需要从受信任的内部网站检查自身的更新,下载,安装和重新启动。
为了使应用程序与用户帐户控制(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>
我们希望标准(非管理员)用户能够在不提示升级到管理员的情况下运行应用程序。我们为标准用户授予了整个应用程序文件夹的完全权限这意味着用户有权使用软件文件,但这是可以接受的。
在UAC完全启用的情况下,用户已在Windows 7,Windows 8和Windows 8.1上使用此应用程序一段时间了。在这些操作系统上,当我们的应用程序启动时,Windows不会提示用户升级到管理员权限。
我们现在正在测试Windows 10上的行为。在Windows 10系统上,启用完全UAC后,Windows会提示标准用户升级为管理员。没有其他改变。 .EXE是相同的,嵌入式清单是相同的请求执行级别highestAvailable
。
我们已经使用C:\ Program Files和C:\ Users \ Public中的客户端文件对此进行了测试。两个地点都有相同的行为。
为什么Windows 10上的UAC提升行为有所不同?先前版本的行为是否是UAC中的错误?它应该一直促使提升吗?
请注意,我们必须启用UAC。我知道如何禁用它。
另请注意,我已测试将清单更改为requestedExecutionLevel
的{{1}}。这不会提示在Windows 10上进行提升。
- 更新 -
我们已跟踪提升,提示本地用户与域用户之间存在差异。 This MSDN article说:
具有其他权限的标准用户的应用程序启动行为(E.G.备份操作员)... [将]在运行应用程序之前提示输入凭据
我们看到本地标准用户未提示提升,但系统会提示本地域用户提升。域用户对受限用户的唯一权限是域用户角色的成员。
答案 0 :(得分:0)
你错过了解highestAvailable
。这意味着如果您的帐户是管理员组的一部分,则请求完整的管理员令牌,但对于普通标准用户,不显示UAC对话框,并且该过程使用标准令牌运行。
如果您的程序需要管理员权限才能运行,那么您需要在清单中使用requireAdministrator
。当标准用户启动此类过程时,将显示over-the-shoulder
UAC对话框,用户可在其中输入管理员帐户的凭据。