我看到这个话题有很多困惑,凯特在这里的回答是不正确和不完整的。
由于 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 以来,它不能再使用了。检查用户是否属于管理员组现在需要更多代码。