2008-09-18 61 views
22

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

+0

你能解释一下你为什么需要这个? – 2008-09-18 19:04:38

+2

例如,我有一个应用程序将API用于需要启用UAC才能工作的外部程序。如果UAC关闭,我想通过对话窗口通知用户。 – 2008-10-03 17:59:31

回答

18

此注册表项应该告诉你:

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

价值EnableLUA (DWORD)

1启用/ 0或丢失禁用

但是,假设你有权阅读它。

以编程方式,您可以尝试读取用户的令牌并猜测它是否是启用了UAC的管理员(请参阅here)。不是万无一失的,但它可能工作。

这里的问题更多的是“你为什么需要知道” - 它对答案有影响。真的,没有API是因为从操作系统行为的角度来看,重要的是用户是否是管理员 - 他们如何选择以管理员身份保护自己是他们的问题。

2

检查在HKLM \ SOFTWARE \微软\ Windows注册表值\ CurrentVersion \政策\系统

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

-1

AFAIK,UAC是本地用户或组的apolicy设置。所以你可以从.Net中读取这个属性。对不起,没有更多的细节,但我希望这有助于

3

你可以做到这一点可以检查DWORD值EnableLUA在以下注册表项:

HKLM/SOFTWARE /微软/视窗/ CURRENTVERSION /策略/系统

如果该值为0(或不存在),那么UAC是关闭的。如果它的存在,并且不为零,那么UAC为ON:

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的状态,但还没有重新启动计算机然而,这个函数会返回不一致的结果。

4

您不想检查UAC是否已启用;那不会告诉你任何事情。

我可以成为禁用UAC的标准用户。

您要检查if the user is running with administrative privileges using CheckTokenMembership

///This function tells us if we're running with administrative permissions. 
function IsUserAdmin: Boolean; 
var 
    b: BOOL; 
    AdministratorsGroup: PSID; 
begin 
    { 
     This function returns true if you are currently running with 
       admin privileges. 
     In Vista and later, if you are non-elevated, this function will 
       return false (you are not running with administrative privileges). 
     If you *are* running elevated, then IsUserAdmin will return 
       true, as you are running with admin privileges. 

     Windows provides this similar function in Shell32.IsUserAnAdmin. 
       But the function is depricated, and this code is lifted from the 
       docs for CheckTokenMembership: 
       http://msdn.microsoft.com/en-us/library/aa376389.aspx 
    } 

    { 
     Routine Description: This routine returns TRUE if the caller's 
     process is a member of the Administrators local group. Caller is NOT 
     expected to be impersonating anyone and is expected to be able to 
     open its own process and process token. 
     Arguments: None. 
     Return Value: 
      TRUE - Caller has Administrators local group. 
      FALSE - Caller does not have Administrators local group. 
    } 
    b := AllocateAndInitializeSid(
      SECURITY_NT_AUTHORITY, 
      2, //2 sub-authorities 
      SECURITY_BUILTIN_DOMAIN_RID, //sub-authority 0 
      DOMAIN_ALIAS_RID_ADMINS,  //sub-authority 1 
      0, 0, 0, 0, 0, 0,    //sub-authorities 2-7 not passed 
      AdministratorsGroup); 
    if (b) then 
    begin 
     if not CheckTokenMembership(0, AdministratorsGroup, b) then 
     b := False; 
     FreeSid(AdministratorsGroup); 
    end; 

    Result := b; 
end; 
1

这个职位是比较古老的,但我想上评论的:“你为什么需要知道”和“检查令牌会员”位。

事实是,微软自己的文档说“如果用户帐户控制已关闭,标准用户尝试执行需要提升的任务”,我们应该提供一个错误,而不是显示按钮和/或链接试图提升的UAC盾牌。详细信息请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx

我们怎么做这个而不检查UAC是否启用的一种方式?

或许检查用户是否具有管理员权限运行是在这种情况下做正确的事情,但谁知道?微软给出的指导意见是,充其量,前途未卜,如果不只是彻头彻尾的混乱。

1

对于其他任何人发现这一点,并正在寻找一个VBScript的解决方案。这是我想出来检测UAC是否启用,如果是这样,重新启动我的脚本与提升的权限。把你的代码放在Body()函数中。我发现XP和Windows 7之间的可移植性存在问题,如果我编写代码来始终启动提升。如果没有UAC,则使用此方法绕过高程。还应该考虑到启用了UAC的2008和更高版本的服务器版本。

On Error Resume Next 
UACPath = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA" 
Dim WshShell 
Set WshShell = CreateObject("wscript.Shell") 
UACValue = WshShell.RegRead(UACPath) 
If UACValue = 1 Then 
'Run Elevated 
    If WScript.Arguments.length =0 Then 
     Set objShell = CreateObject("Shell.Application") 
     'Pass a bogus argument with leading blank space, say [ uac] 
     objShell.ShellExecute "wscript.exe", Chr(34) & _ 
     WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1 
     WScript.Quit 
    Else 
     Body() 
    End If 
Else 
Body() 
End If 

Function Body() 
MsgBox "This is the body of the script" 
End Function 
相关问题