如何检测是否已启用Vista UAC?
根据是否启用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的状态但尚未重新启动计算机,则此功能将返回不一致的结果。