如何检测是否已启用Vista UAC?

时间:2020-03-06 14:22:51  来源:igfitidea点击:

根据是否启用Vista UAC,我需要我的应用程序的行为有所不同。我的应用程序如何检测用户计算机上UAC的状态?

解决方案

在HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System中检查注册表值

EnableLUA值确定UAC是否处于活动状态。

这篇文章在Cto中具有示例代码,以测试是否启用了UAC,以及是否为当前应用授予了提升的权限。我们可以下载代码并根据需要进行解释。还链接了一个示例,在C ++中显示了相同的示例

http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html

该文章中的代码不只是从注册表中读取。如果启用了UAC,则我们可能无权从注册表中读取该内容。

AFAIK,UAC是本地用户或者组上的策略设置。因此,我们可以从.Net中读取此属性。抱歉,没有更多详细信息,但我希望这会有所帮助

此注册表项应告诉我们:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

EnableLUA(DWORD)

启用" 1" /禁用" 0"或者丢失

但这假设我们有权阅读它。

我们可以通过编程方式尝试读取用户的令牌,并猜测它是否是启用了UAC的管理员(请参见此处)。并非万无一失,但它可能会起作用。

这里的问题更多是与答案有关的"我们为什么需要知道"。实际上,没有API,因为从OS行为的角度来看,重要的是用户是否是管理员,而他们如何选择以管理员身份来保护自己是他们的问题。

我们可以通过检查以下注册表项中的DWORD值EnableLUA来完成此操作:

HKLM /软件/ Microsoft / Windows / CurrentVersion /策略/系统

如果该值为0(或者不存在),则UAC为OFF。如果存在且非零,则UAC处于打开状态:

BOOL IsUacEnabled( )
{
    LPCTSTR pszSubKey = _T("SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System");
    LPCTSTR pszValue = _T("EnableLUA");
    DWORD dwType = 0;
    DWORD dwValue = 0;
    DWORD dwValueSize = sizeof( DWORD );

    if ( ERROR_SUCCESS != SHGetValue( HKEY_LOCAL_MACHINE, pszSubKey, pszValueOn, 
        &dwType, &dwValue, &dwValueSize) )
    {
            return FALSE;
    }

    return dwValue != 0;
}

请注意,如果用户更改了UAC的状态但尚未重新启动计算机,则此功能将返回不一致的结果。