8

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

我有这种情况:在 Windows 6 或更高版本上,当用户打开配置窗口时,我必须BCM_SETSHIELD在 OK 按钮上显示盾牌 ( ),当需要提升权限才能完成任务时。- 我知道在 Windows UI 中,即使 UAC 被禁用,盾牌总是可视化为“管理任务”,但客户有这个特定的要求。

我已经起草了这个条件以显示图标:

  1. 用户没有管理权限
  2. 目前的流程有TOKEN_ELEVATION_TYPE == TokenElevationTypeLimited

条件 #1 很简单:如果用户没有管理权限,则无论 UAC 是什么,都始终需要提升。#2 表示用户具有管理权限,任何其他值TOKEN_ELEVATION_TYPE表示不需要提升。

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

4

2 回答 2

3

你说的对。大多数人只是在按钮将被提升时打开防护罩,但正确的做法是在按钮将导致提升时打开防护罩(即,如果您已经提升,则抑制它,因为您启动的所有内容都将保持提升除非您遇到一些麻烦来启动非提升的进程,并在 UAC 关闭时抑制它。)

好消息是,如果管理员组中的某个人(在 UAC 下)运行非提升的应用程序,false当您询问他们是否是管理员时,您会得到回复。所以我认为你可能只接受那一项测试就可以了。

于 2010-06-26T19:25:01.690 回答
2

我看到这个话题有很多困惑,凯特在这里的回答是不正确和不完整的。

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

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

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

HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System

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

但是还有一点这里还没有提到。在控制面板中,可以配置“不提示提升”。在这种情况下,管理员用户可以从另一个未提升的进程启动提升的进程,并且不会出现任何 UAC 提示。

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

对于所有非管理员用户,都有“ ConsentPromptBehaviorUser”键,但这只会改变行为,但不能关闭提升。非管理员总是会收到 UAC 提示。(如果 UAC 没有完全关闭)

你怎么知道你的进程是否运行提升:调用OpenProcess(),然后OpenProcessToken(),然后GetTokenInformation(TokenElevation)

并获得完整性级别调用GetTokenInformation(TokenIntegrityLevel),然后GetSidSubAuthority()

因此,如果您只想在确实需要提升时才显示您的图标,您必须检查您的进程是否运行提升并另外检查这些注册表项,您必须知道用户是否是管理员。这涉及几行代码,我会考虑在可能需要提升以使其保持简单时始终显示此图标。

请注意,该 APIIsUserAnAdmin()已弃用。自 Vista 以来,它不能再使用了。检查用户是否属于管理员组现在需要更多代码。

于 2015-08-19T15:51:41.973 回答