La API de Windows (utilizado) para tener una función de ayuda (IsUserAnAdmin) para saber si se está ejecutando con privilegios administrativos.
OS Account Type UAC IsUserAdmin
============== ============= ============ ===========
Windows XP Standard n/a False
Windows XP Administrator n/a True
Windows Vista Standard Disabled False
Windows Vista Administrator Disabled True
Windows Vista Standard Not Elevated False
Windows Vista Administrator Not Elevated False
Windows Vista Standard Elevated True
Windows Vista Administrator Elevated True
La función de envoltura Shell32 está obsoleta; lo cual está bien porque era a wrapper around other code, which you can still call mismo:
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 deprecated, 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 callers
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;
En otras palabras: Esta función le da la respuesta que desea: ¿Los archivos del programa de actualización del usuario.
Necesita estar cansado del código que verifica si es miembro del grupo del Administrador. Puede ser parte del grupo del Administrador, pero no tener privilegios administrativos. También puede tener privilegios administrativos, pero no ser parte del grupo del Administrador.
La forma aceptada de hacer esto es manifestar con requieren admin cualquier programa que necesita para escribir al directorio de archivos de programa. –
Por lo que sé, los derechos de administrador SON suficientes para crear/actualizar archivos en c: \ archivos de programa! – Andreas
@Andreas: no es así, debe haber iniciado su programa con la opción 'Ejecutar como administrador'. Tengo todos los derechos de administrador en mi pc de desarrollo, pero no puedo crear/actualizar un archivo en c: \ archivos de programa ... a menos que lo inicie con 'Ejecutar administrador de anuncios'. Debido a que el mismo programa (un programa de actualización web por cierto) puede ejecutarse con o sin 'Ejecutar como administrador', debería poder verificar este estado. – Edelcom