UAC和提升提示模式

时间:2010-06-26 16:13:08

标签: windows uac design-patterns privilege-elevation

我已经阅读了几个有关UAC和权限提升的问题,但我没有找到满意/全面的答案。

我有这种情况:在Windows 6或更高版本上,当用户打开配置窗口时,我必须在OK按钮上显示屏蔽(BCM_SETSHIELD如果特权提升将被要求完成任务。 - 我知道在Windows用户界面中,屏蔽始终可视化为“管理任务”,即使UAC已禁用,但客户也有此特定请求。

我已经草拟了这个条件,以便显示图标:

  1. 用户具有管理权限
  2. 当前流程有TOKEN_ELEVATION_TYPE == TokenElevationTypeLimited
  3. 条件#1很简单:如果用户没有管理权限,则无论UAC如何,总是需要提升。 #2表示用户具有管理权限,TOKEN_ELEVATION_TYPE的任何其他值表示不需要提升。

    真的那么简单吗?我错过了什么?并且 - 有关于此主题的文档或众所周知的模式?

2 个答案:

答案 0 :(得分:3)

你是对的。如果按钮升高,大多数人只是打开盾牌,但正确的做法是如果按钮会导致升高,则将盾牌打开(如果你已经升高,则禁止它,因为你发动的一切都将保持升高除非您在启动非升级过程时遇到麻烦,并在UAC关闭时禁止它。)

好消息是,如果管理员组中的某个人(在UAC下)运行非提升的应用程序,当您询问他们是否为管理员时,您将返回false。所以我认为只要进行一次测试你就可以了。

答案 1 :(得分:2)

我发现这个话题存在很多混淆,凯特的答案不正确和不完整。

由于Vista可能会登录管理员,但他的进程不会自动升级。管理员有一个所谓的“拆分令牌”。这意味着可能有为SAME管理员用户运行的进程,其中一些运行升级而另一些运行不升高。当管理员运行未提升的进程时,其令牌的某些权限已被删除。它不再是在XP中,所有进程都运行升高或未升高。

从www.sysinternals.com安装 Process Explorer 并启用“完整性级别”列。如果您看到“中”,则此过程不会升高。如果您看到“高”,则进程升高。如果进程以Integrity级别“High”运行,则不需要UAC提示来启动另一个提升的进程。

当UAC完全关闭时,所有进程都运行“高”,因此永远不需要提升。可以在

下关闭UAC
HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System

设置密钥“EnableLUA”。更改此设置需要重新启动。

但还有另一点尚未提及。 在“控制”面板中,可以配置“不提示提升”。在这种情况下,管理员用户可以从另一个未升级的进程启动升级进程,并且将显示NO UAC提示。

此设置存储在管理员用户的密钥“ConsentPromptBehaviorAdmin”中的相同注册表路径下。

对于所有非管理员用户,都有密钥“ConsentPromptBehaviorUser”,但这只会更改行为,但无法关闭升级。非管理员将始终获得UAC提示。 (如果UAC没有完全关闭)

您如何知道您的流程是否提升: 致电OpenProcess(),然后致电OpenProcessToken(),然后致电GetTokenInformation(TokenElevation)

要获得诚信等级电话GetTokenInformation(TokenIntegrityLevel),然后GetSidSubAuthority()

因此,如果您只想在需要提升时显示您的图标,则必须检查您的进程是否已提升并另外检查这些注册表项,您必须知道该用户是否为管理员。这会产生几行代码,我会考虑在需要提升 以保持简单时始终显示此图标。

请注意,不推荐使用API​​ IsUserAnAdmin()。自Vista以来不得再使用它。检查用户是否属于administrators群组,现在需要更多代码。