代码之家  ›  专栏  ›  技术社区  ›  lornova

UAC和高程提示模式

  •  8
  • lornova  · 技术社区  · 14 年前

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

    我有这样的场景:在Windows6或更高版本上,当用户打开一个配置窗口时,我必须显示屏蔽( BCM_SETSHIELD 只有 如果需要提升权限才能完成任务。-我知道在Windows用户界面中,即使UAC被禁用,屏蔽也总是被可视化为“管理任务”,但是客户有这个特定的请求。

    显示 图标:

    1. 用户有 行政权利
      或者
    2. 当前进程已完成 TOKEN_ELEVATION_TYPE == TokenElevationTypeLimited

    条件#1很简单:如果用户没有管理权限,无论UAC如何,总是需要提升。#2表示用户拥有管理权限,以及 TOKEN_ELEVATION_TYPE 意味着不需要仰角。

    真的那么简单吗?我错过了什么?关于这个话题,有一个记录在案的或者众所周知的模式吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Kate Gregory    14 年前

    你是对的。大多数人只是在按钮将被提升的情况下打开防护罩,但正确的做法是在按钮将导致提升的情况下打开防护罩(即,如果您已经被提升,则抑制它,因为您启动的所有内容都将保持提升状态,除非您费劲启动非提升进程,如果UAC关闭,则抑制它)

    好消息是,如果Administrators组中有人(在UAC下)运行一个非提升的应用程序,那么您将返回 false

        2
  •  2
  •   Elmue    9 年前

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

    因为Vista管理员可以登录,但是他的进程不会自动运行。管理员有一个所谓的“分割令牌”。这意味着可能存在为同一管理用户运行的进程,其中一些进程运行提升,而另一些进程不运行提升。当管理员运行未提升的进程时,其令牌的某些特权已被删除。它不再像XP那样所有进程都运行在提升或不提升状态。

    安装 进程管理

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

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

    EnableLUA

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

    ConsentPromptBehaviorAdmin “对于管理员用户。

    ConsentPromptBehaviorUser 但这只会改变巴哈维奥,但不能关闭仰角。非管理员总是会得到UAC提示(如果UAC未完全关闭)

    呼叫 OpenProcess() OpenProcessToken() ,那么 GetTokenInformation(TokenElevation)

    GetTokenInformation(TokenIntegrityLevel) 然后 GetSidSubAuthority()

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

    请注意API IsUserAnAdmin() 已弃用。它不能再使用了,因为Vista。现在检查用户是否属于administrators组的代码要多得多。