windows-vista - ser - uac windows 7
¿Cómo detectar si Vista UAC está habilitado? (8)
AFAIK, UAC es una configuración de política del usuario o grupo local. Para que pueda leer esta propiedad desde .Net. Perdón por no tener más detalles, pero espero que esto ayude
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?
Compruebe el valor de registro en HKLM / SOFTWARE / Microsoft / Windows / CurrentVersion / Policies / System
El valor EnableLUA determina si UAC está activo.
Puede hacerlo examinando el valor DWORD EnableLUA en la siguiente clave de registro:
HKLM / SOFTWARE / Microsoft / Windows / CurrentVersion / Policies / System
Si el valor es 0 (o no existe), entonces el UAC está desactivado. Si está presente y no es cero, entonces UAC está activado:
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 aún no ha reiniciado la computadora, esta función arrojará un resultado incoherente.
Esta publicación tiene un código de muestra en C # para probar si UAC está activado y si la aplicación actual recibió derechos elevados. Puede descargar el código e interpretarlo según sea necesario. También hay una muestra vinculada 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 esa publicación no solo se lee en el registro. Si UAC está habilitado, es posible que no tenga derecho a leerlo desde el registro.
No desea verificar si UAC está habilitado; eso no te dice nada
Puedo ser un usuario estándar con UAC deshabilitado.
Desea verificar si el usuario se está ejecutando con privilegios administrativos usando 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;
Esta publicación es bastante antigua, pero quería comentar sobre los bits "¿por qué necesitas saber?" Y "verificar membresía de token".
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 UAC que intento de elevación Consulte http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx hacia la parte inferior para obtener más detalles.
¿Cómo podemos hacer esto sin una forma de verificar si UAC está habilitado?
Tal vez, verificar si el usuario se está ejecutando con privilegios de administrador es lo correcto en esta instancia, pero ¿quién sabe? La orientación que da Microsoft es, en el mejor de los casos , dudosa, si no simplemente francamente confusa.
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
Esta clave de registro debe decirle:
HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System
Valor EnableLUA (DWORD)
1
habilitado / 0
o perdido deshabilitado
Pero eso supone que tienes 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 aquí ). 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.