C++ 如何使用C+编程检测是否在Windows 8中启用UAC+;?
在Windows XP/Windows 7中,我可以检查注册表以确定是否启用了UAC,但这个技巧在Windows 8中不起作用C++ 如何使用C+编程检测是否在Windows 8中启用UAC+;?,c++,windows-8,uac,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 =
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);
}
有什么想法吗?在Windows-8中关闭UAC似乎与Windows-7不同。在Windows-8上,在“更改用户帐户控制设置”屏幕中向下滑动条的功能不同。它根本没有禁用UAC。 下面说: 要真正禁用UAC(在Windows-8上),您必须将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policys\System注册表中的EnableLUA值修改为0并重新启动,但这不是操作系统的受支持状态,会阻止现代应用程序,所以不要这样做 [编辑]:此网站声称可以使用组策略在Windows 8上关闭UAC,而不会给MarketPlace应用程序造成问题:
非常令人惊讶。。。似乎我必须更改我的程序的许多部分以支持UAC:(UAC在Windows 8上不能被禁用。因此,只需检查操作系统版本,再实用不过了。UAC在Windows 8上不是总是启用的吗?这可能就是为什么它总是返回
true
(否则…你是如何尝试关闭它以进行检查的?)