我看到这个主题存在很多混淆,Kate的回答不正确且不完整。自从Vista以来,管理员可能已登录但他的进程不会自动运行提升。管理员有一个所谓的“拆分令牌”,这意味着可能为同一管理员用户运行某些进程并且其中一些运行提升,而其他进程则不运行提升。当管理员运行未提升的进程时,他的令牌中的某些特权已被删除。它不再像XP那样,所有进程都运行提升或未提升。
从www.sysinternals.com安装Process Explorer并启用“Integrity Level”列。如果你在那里看到“Medium”,这个进程就不会运行提升。如果你在那里看到“High”,这个进程将运行提升。如果进程以“High”完整性级别运行,则无需UAC提示即可启动另一个进程。
当UAC完全关闭时,所有进程都运行“High”,所以永远不需要提升。UAC可以在下面关闭。
HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System
设置键 "EnableLUA
"。更改此设置需要重新启动。
但这里还有一个尚未提及的要点。
在控制面板中,可以配置“无需提示即提升”。在这种情况下,管理员用户可以从另一个非提升进程启动提升进程,并且不会出现 UAC 提示。
此设置存储在相同的注册表路径下,键名为 "ConsentPromptBehaviorAdmin
"。
对于所有非管理员用户,存在键 "ConsentPromptBehaviorUser
",但这只改变行为,无法关闭提升。非管理员用户始终会收到 UAC 提示。(如果 UAC 没有完全关闭)
如何知道您的进程是否正在以提升方式运行:
调用 OpenProcess()
,然后调用 OpenProcessToken()
,再调用 GetTokenInformation(TokenElevation)
。
而要获取完整性级别,则调用 GetTokenInformation(TokenIntegrityLevel)
,然后调用 GetSidSubAuthority()
。
因此,如果您只想在确实需要提升时显示您的图标,则必须检查您的进程是否正在以提升方式运行,并另外检查这些注册表键,并且您必须知道用户是管理员还是普通用户。这涉及到几行代码,我会考虑始终显示此图标以保持简单。
请注意,API IsUserAnAdmin()
已弃用。自 Vista 以来,不再使用它。现在要检查用户是否属于管理员组需要更多的代码。