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

我有这种情况:在Windows 6或更高版本上,当用户打开配置窗口时,我必须显示盾牌(BCM_SETSHIELD)在确定按钮上 只要 如果需要特权高程来完成任务。 - 我确实知道,在Windows UI中,即使禁用了UAC,盾牌也总是可视化的,即使是禁用了UAC,但客户有此特定的请求。

我已经起草了这种情况 显示 图标:

  1. 用户有 不是 行政权利
    或者
  2. 当前的过程有 TOKEN_ELEVATION_TYPE == TokenElevationTypeLimited

条件#1很简单:如果用户没有管理权权限,则无论UAC如何,始终都需要高程。 #2意味着用户具有管理权,以及 TOKEN_ELEVATION_TYPE 意味着不需要海拔。

真的那么简单吗?我缺少什么?而且 - 有关此主题的有记录或众所周知的模式?

有帮助吗?

解决方案

你说的对。大多数人只是在按钮升高时戴上屏蔽台,但是正确的办法是将屏蔽台放在按钮上是否会导致高程(即如果您已经升高,则抑制它,因为您发布的所有内容都将保持抬高除非您遇到一些麻烦来启动非升高过程,并在UAC关闭时抑制它。)

好消息是,如果管理员组中的某人(在UAC下)运行(在UAC下)一个未提升的应用程序,您将回来 false 当您询问他们是否是管理员时。因此,我认为您可能只对该测试都可以。

其他提示

我看到这个主题有很多混乱,凯特(Kate)的答案是不正确和不完整的。

由于Vista可以登录管理员,但他的过程不会自动运行。管理员有一个称为“拆分令牌”的所谓。这意味着可能有同一管理用户运行的流程,其中一些运行升高,而另一些则不升高。当管理员运行不提高的过程时,他的代币的某些特权已被删除。它不再像XP中所有进程升高或不升高的XP一样。

安装 流程资源管理器 摘自www.sysinternals.com,并启用列“完整性级别”。如果您看到“中等”,则此过程不会升高。如果您看到“高”,则过程将升高。如果该过程以完整性级别“高”运行,则不需要UAC提示即可启动另一个进程。

当UAC完全关闭时,所有过程都会“高”运行,因此不需要高程。 UAC可以在下面关闭

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

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

但是这里尚未提及另一点。在控制面板中,可以配置“提升而不提示”。在这种情况下,管理员用户可以从另一个未升高的过程开始升高过程,并且不会出现UAC提示。

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

对于所有非Admin用户,都有关键”ConsentPromptBehaviorUser“但是这只会改变巴哈维尔,但无法关闭高程。非admins将始终得到UAC提示。(如果UAC并非完全关闭)

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

并获取完整性级别的电话 GetTokenInformation(TokenIntegrityLevel) 进而 GetSidSubAuthority()

因此,如果您只想在真正需要高程的情况下显示图标,则必须检查您的进程是否运行并另外检查这些注册表键,并且必须知道用户是否是管理员。这涉及几行代码,我会考虑在高程时始终显示此图标 可能 需要保持简单。

请注意API IsUserAnAdmin() 被弃用。由于Vista,因此不再使用它。现在检查用户是否属于管理员组的代码现在要多得多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top