如何以编程方式检测是否在Windows 8中使用C ++启用了UAC?

时间:2012-12-23 15:41:28

标签: c++ windows-8 uac

在Windows XP / Windows 7中,我可以检查注册表以确定是否启用了UAC,但此技巧不适用于Windows 8.

BOOL FileOps::IsUacEnabled()
{
    LPCTSTR pszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");
    LPCTSTR pszValueOn = _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;
}

此功能始终返回从Windows 8使用时启用UAC。 我见过的其他方法也失败了:

HANDLE hToken; 
TOKEN_ELEVATION_TYPE elevationType; 
DWORD dwSize;

OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken); 
GetTokenInformation(hToken, TokenElevationType, &elevationType, sizeof(elevationType), &dwSize);

bool bUAC_Enabled = false;

switch (elevationType) { 
case TokenElevationTypeDefault: 

  wprintf(TEXT("\nTokenElevationTypeDefault - User is not using a split token.\n")); 
  break; 
case TokenElevationTypeFull: 

  wprintf(TEXT("\nTokenElevationTypeFull - User has a split token, and the process is running elevated.\n")); 
  break; 
case TokenElevationTypeLimited: 

  wprintf(TEXT("\nTokenElevationTypeLimited - User has a split token, but the process is not running elevated.\n")); 
  break; 
}

if (hToken) { 
CloseHandle(hToken); 
} 

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

似乎在Windows-8中关闭UAC与Windows-7不同。在“更改用户帐户控制设置”屏幕中向下滑动栏在Windows-8上的功能有所不同。它根本不会禁用UAC。 以下LINK说: 要真正禁用UAC(在Windows-8上),您必须将HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System中的注册表中的EnableLUA值修改为值0并重新启动,但这不是受支持的操作系统的状态并将阻止现代应用程序 - 所以不要这样做。

[编辑]:此网站声称可以在Windows 8上关闭UAC,而不会使用组策略为MarketPlace应用程序创建问题: http://www.petenetlive.com/KB/Article/0000687.htm#.UOnBsm_FWrs

非常令人惊讶......似乎我将不得不改变我的程序的许多部分来支持UAC :(