2008-09-18 29 views
22

Necesito que mi aplicación se comporte de manera diferente dependiendo de si Vista UAC está habilitado o no. ¿Cómo puede mi aplicación detectar el estado de UAC en la computadora del usuario?¿Cómo detectar si Vista UAC está habilitado?

+0

¿Puede explicar por qué necesita esto? –

+2

Por ejemplo, tengo una aplicación que usa una API para un programa externo que requiere que UAC esté habilitado para que funcione. Si UAC está desactivado, me gustaría informar al usuario con una ventana de diálogo. –

Respuesta

18

Esta clave del Registro debe decirle:

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

Valor EnableLUA (DWORD)

1 habilitar/0 o no discapacitados

Pero que asume tiene los derechos para leerlo.

Mediante programación, puede intentar leer el token del usuario y adivinar si se trata de un administrador que se ejecuta con UAC habilitado (consulte here). No es infalible, pero puede funcionar.

El problema aquí es más un "por qué necesitas saber" - tiene relación con la respuesta. En realidad, no hay API porque, desde el punto de vista del comportamiento del sistema operativo, lo que importa es si el usuario es administrador o no, cómo elige protegerse a sí mismo, ya que el administrador es su problema.

+0

Esta es una captura 22. Si UAC está habilitado, es probable que no tenga derechos para leerlo. –

+0

Una corrección menor: la clave de registro es HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System, y EnableLUA es un valor DWORD (no es una clave). HTH –

+0

Debe usar! = 0 y no comparar con 1 de acuerdo con la fuente google chrome (Aparentemente algunos sistemas tienen> 1 valores) – Anders

2

cheque por el valor de registro en HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System

El valor EnableLUA determina si UAC está activo.

4

This post tiene código de ejemplo en C# para comprobar si UAC está activado y si la aplicación actual tiene derechos elevados. Puede descargar el código e interpretarlo según sea necesario. También ligado hay un ejemplo que muestra lo mismo en C++

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

El código en ese puesto no se limita a leer desde el registro. Si UAC está habilitado, es posible que no tenga derecho a leerlo desde el registro.

-1

AFAIK, UAC es una configuración apolítica en el usuario o grupo local. Para que pueda leer esta propiedad desde .Net. Lo siento por no tener más detalles, pero espero que esto ayude a

3

Puede hacerlo examinará el valor DWORD EnableLUA en la siguiente clave del registro:

HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Políticas/System

Si el valor es 0 (o no existe) entonces el UAC está DESACTIVADO. Si está presente y no es cero, entonces UAC está encendido:

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; 
} 

Tenga en cuenta que si el usuario ha cambiado el estado de UAC, pero no ha reiniciado el equipo, sin embargo, esta función devolverá un resultado incoherente.

4

No desea comprobar si UAC está habilitado; eso no te dice nada

Puedo ser un usuario estándar con UAC deshabilitado.

desea comprobar 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

Este post es bastante antiguo, pero quería comentar sobre el "¿por qué necesita saber" y "check de fichas de afiliación" bits. El hecho es que la propia documentación de Microsoft dice que "Si el Control de cuentas de usuario se ha desactivado y un usuario estándar intenta realizar una tarea que requiere elevación", deberíamos proporcionar un error en lugar de mostrar botones y/o enlaces con el escudo de UAC que intenta la elevación. Ver http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx hacia abajo para más detalles.

¿Cómo podemos hacer esto sin una forma de verificar si UAC está habilitado?

Quizás la comprobación de si el usuario se está ejecutando con privilegios de administrador es lo correcto en este caso, pero ¿quién sabe? La orientación que da Microsoft es en el mejor de los casos, si es que no, simplemente confunde.

1

Para cualquier otra persona que encuentre esto y esté buscando una solución de VBScript. Esto es lo que se me ocurrió para detectar si UAC está habilitado y si es así reiniciar mi script con privilegios elevados. Simplemente ponga su código en la función Body(). Descubrí que había problemas con la capacidad de transporte entre XP y Windows 7 si escribía código para que siempre se lanzara elevado. Usando este método evito la elevación si no hay UAC. También debe tener en cuenta las versiones de servidor 2008 y posteriores que tienen habilitado el UAC.

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 
Cuestiones relacionadas